HTTPS SSL 인증서 자동갱신 등록방법(Let’s Encrypt)

24

 

Let’s Encrypt SSL인증서를 수동으로 갱신 하는 방법은 명령어 한줄이면 되지만 서버에 접속해야하고 명령어 넣어줘야하고 정말이지 여간 귀찮은 일 아닐 수 없습니다. 그래서 이번 글에서는 그 과정을 자동으로 실행하는 방법을 다룹니다.

저도 리눅스 마스터가 아닌 관계로 이래저래 알아봐야 했는데요.  리눅스에는 스케줄 관리자인 크론탭이라는게 있더군요.  우리가 정해두는 시간규칙에 따라 그 시간이 되면 해야할일을 리눅스 컴퓨터가 자동으로 실행하도록 해줄 수 있습니다. 그래서 인터넷에 찾아보니 일정 시간이 되면 자동으로 인증서 발급 명령어를 실행해주도록 스케줄 작업 관리자에 등록하는 방법이 추천되고 있었습니다. 

먼저 리눅스 스케줄 관리자인 크론탭에 대해 먼저 알아봐야겠습니다.

 

리눅스 스케줄러 Crontab에 등록할 자동갱신 스케줄

리눅스 크론탭은 텍스트 파일에 한 줄 씩 시간규칙과 실행할 명령어로 이루어진 스케줄이 작성되는 모양새입니다. 리눅스 크론탭 시간 스케줄을 작성하는 방법은 관심있다면 별도로 검색해보시고 제글은 전체적인 틀을 이해하는데 도움이 될 겁니다.

 

크론탭 텍스트파일에 한줄 씩 스케줄을 등록하면 되는데요. 스케줄은 시간스케줄 실행할명령어 형태이고 실행할 명령어는 한 줄에 여러개 등록 가능합니다. 그래서 아래와 같은 형태가 됩니다. 각 단위는 스페이스바 한칸으로 구분됩니다.

분단위 시간단위 몇일 몇월 요일 실행할명령어

참고: 요일은 0~7 숫자중 하나를 지정할 수 있는데, 1은 월요일이고 0과 7은 둘다 일요일

 

Let’s Encrypt측에서는 갱신시도가 실패할 것을 고려하여 하루 두번씩 갱신 명령어를 실행시키라고 권장하더군요. 그래서 시간스케줄을 하루 두 번으로 하기위해서 저는 처음 두개, 그러니까 분 단위는 6으로 시간단위는 5,10으로 했습니다. 05시 6분과 10시 6분에 같은 명령어를 실행 해주는 것이죠. 다른 시간단위는 와일드카드 문자인 *기호를 써서 매일 실행되도록 했습니다. 아래와 같은 형태이죠.

6 5,10 * * * 실행할명령어

 

이제 실행할 명령어를 정해야할 차례인데요.  이전 글에서 수동으로 인증서를 갱신할 때  certbot-auto renew 명령어를 통해서 갱신한다고 했죠. 그런데 ./을 붙여서 ./certbot-auto renew 처럼 실행시켰는데요.  ./은 상대경로를 나타내고 CLI에서 현재위치, 그러니까 bitnami 사용자폴더에 있는 certbot-auto를 실행하는 것이죠. 하지만 root의 크론탭 파일이 위치한 곳은 bitnami 사용자 폴더가 아니기 때문에 절대경로(full path)를 이용해야겠습니다.

 

6 5,10 * * * /home/binami/cerbot-auto renew

이렇게 하면 매일 5시 6분과 10시 6분에 /home/bitnami 폴더에 위치한 cerbot-auto를 실행시켜 renew 명령을 실행하게됩니다. 

 

또 한가지, 실행할 명령어는 여러개를 실행할 수 있습니다.  제가 알아보기로는 이런 방법을 통해 인증서 갱신후 아파치 웹서버를 재시작하지 않아도 된다고 하더군요. 하지만 해외커뮤니티에서 NGiNX(아파치와는 다른 웹서버)의 경우 재 실행해줘야한다는 의견이 있었기에 확실히 하기위해서 인증서 갱신 후 아파치 웹서버도 재실행 해주기로 결정했습니다.

 

그런데 하루에 두번씩 실행될 때마다 항상 웹서버를 재실행하는 것은 비효율적입니다. 더군다나 인증서 갱신기간이 아닐 때는 인증서를 갱신하지도 않는데 말예요. 그래서 제가 찾아보니 인증서가 성공적으로 갱신되었을 때만 다음 명령어를 실행하는 --renew-hook 이라는 게 있더군요. 그래서 아래와 같은 형식으로 스케줄을 작성하게 되었습니다.

6 5,10 * * * 인증서갱신_시도_명령어 --renew-hook 아파치웹서버_재실행_명령어

최종적으로 우리가 작성할 스케줄을 종합하면 아래처럼 됩니다

참고로 제블로그의 LEMP스택 구축하기를 따라하신 nginx 서버 사용자의 경우 여기 글(링크)을 참고 하여 크론탭 명령어를 작성해주세요.

6 5,10 * * * /home/bitnami/certbot-auto renew --renew-hook "sudo /opt/bitnami/ctlscript.sh restart apache"

이제 위의 저 한 줄을 크론탭에 작성해주면 됩니다. 

위의 인증서 갱신 시도 명령어의 경우 certbot-auto 파일이 위치한 절대경로/home/hitnami/ 를 함께 적어줬습니다. 웹서버 재실행 명령의 경우 아파치 재시작 스크립트 ctlscript.sh 파일이 위치한 /opt/bitnami/ 경로인데 이 스크립트의 실행이 root로 한정되므로 앞에 sudo 명령어를 붙였네요.

참고: 아파치 재실행 명령어를 큰따옴표(“)로 감싼이유는 한줄에 여러 명령어를 작성함에 따라  명령어 구분을 확실히 하기 위해서 라고 합니다.

 

참, 그리고 내친김에 위에 스케줄에 더해서 정기적으로 서버를 리부팅해주는 크론탭 스케줄도 함께 작성해줄 수도 있습니다. 엔터를 입력하고 다음줄 또는 이전 줄에 아래 명령어를 입력해줍니다.

30 04 * * 0 root /sbin/shutdown -r now

위 스케줄은 일요일(0) 4시 30분마다  root 권한을 사용해서 서버컴퓨터를 리부팅(-r)해주는 파일을 실행하는 명령어인데요. bitnami 에서는 /sbin/ 폴더에있는 shutdown 스크립트 파일이 있어 이것을 실행해 서버를 셧다운 해줄수 있습니다.  -r 옵션을 이용해 리부팅을 해주는 것이죠.

종합해서 아래 두줄이지만, 이글에서의 스크린샷에는 한 줄만 작성되었습니다:

30 04 * * 0 root /sbin/shutdown -r now
6 5,10 * * * /home/bitnami/certbot-auto renew --renew-hook "sudo /opt/bitnami/ctlscript.sh restart apache"

 

크론탭에 HTTPS SSL 자동갱신 스케줄 작성

현재 리눅스서버 사용자가 등록한 크론탭 작업목록을 보려면 crontab -l 명령어를 입력해봅니다.

crontab -l

비트나미 사용자로 등록한 크론탭 작업목록: 아무것도 없음

현재로선 bitnami 사용자가 등록한 작업 스케줄이 아무 것도 없기에 no crontab for bitnami 라는 메시지가 나올 뿐입니다. 

 

크론탭파일을 편집하려면 crontab -e 명령어를 사용하는데요. 제가 한가지 주목 한 것은 서버사용자별 스케줄인데요. 크론탭은 서버 사용자별로 작업스케줄을 등록해줄 수 있습니다.  지금은 bitnami 사용자를 사용중이라서 crontab -l 명령어를 썼을 때 위처럼 해당사용자의 스케줄 목록을 출력했던 것이죠. 그런데 서버는 사용자권한에 대해 매우 민감하고 일반 사용자는 권한이 없는 작업은 할 수 없습니다.  자동갱신 과정에서 그런 권한 문제가 있을 지는 모르겠지만 저는 root 사용자의 크론탭에 작업을 등록하기로 결정했습니다.

먼저 아래 명령어를 써서 root 관리자로 전환합니다.

sudo su

sudo su 명령어로 루트관리자로 전환

 

그런다음 crontab -e 명령어를 사용해서 크론탭을 편집을 시작합니다.

crontab -e 크론탭 편집 명령어 입력

혹시, 위 명령어를 입력 후 아래와 같은 메시지가 나오면 2를 입력해서 nano 편집기를 선택합니다.

select an editor 에서 2번을 입력하면 nano 편집기가 선택된다.

 

그럼 아래처럼 nano 편집기에서 크론탭 스케줄 파일 내용이 열립니다.

크론탭 파일 내용. 설명서가 써있다

 

수많은 영어 문장에 겁먹을 필요없습니다. 처음 크론탭을 편집할 때 나타나는 이것은 텍스트파일 뿐이고 그 안에는  #기호로 주석처리된 크론탭 설명서가 써있을 뿐입니다. 여타 다른 모든 설정파일에서 처럼  앞에  #기호가 붙은 줄은 주석으로서, 시스템에 아무런 영향을 미치지 않습니다. 현재로선 이 파일에 아무런 스케줄도 등록되어있지 않으니 저것들은 모두 지워도 됩니다.

참고: 파일 전체 내용이 보이지 않는다면 터미널창을 크게 키워보세요. 텍스트파일 내용이 길다면 키보드 아래 방향키를 눌러 페이지를 내려 볼 수 있습니다.

 

아래처럼 nano편집기에서 스케줄을 작성해줍니다.

스케줄 작성 완료 화면

저는 #기호가 붙은 설명서 줄을 삭제하지 않았지만 원래 있던 설명 줄은 삭제하는게 보기 편하실 겁니다. 단지 우리가 추가하는 스케줄 명령줄 앞에는 #기호가 붙지 않도록 해주세요.

 

이제 nano 편집기를 끝내기위해 단축키 Control + x 를 누르고, y를 입력해서 저장, 엔터키(리턴키)를 누르면 nano 편집기를 빠져나가게 됩니다.

그런다음 crontab -l 명령어로 크론탭 스케줄을 확인해보면 아래처럼 나옵니다. 저는 주석으로된 설명서 글까지 출력되었네요.

크론탭 등록 확인

 

이렇게 root 관리자의 크론탭 스케줄에 자동갱신 등록을 마쳤습니다. 이제 root 관리자에서 bitnami 사용자로 되돌아가는 명령어인 sudo su bitnami 를 입력해주시고 exit를 입력해서 서버접속을 끝내시면 되겠습니다.

 

자동갱신 동작확인

업데이트: 이글을 작성한지 어느덧 2개월이 지났습니다.   과연 자동갱신이 잘 동작했는지 서버에 접속해서 certbot-auto 프로그램 파일이 있는 위치(사용자 홈폴더)에서 아래 명령어를 실행해 보았습니다.

./certbot-auto certificates

자동 갱신된 인증서

이전 글에서 수동갱신한 뒤 확인해보았을 때 만료일이 2017년 11월 30일이었으나 2018년 1월 30일로 연장된 것으로 확인됩니다. 그리하여 이 글에서 다룬 자동 갱신 방법은 잘 작동하는 것으로 결론이 났습니다.

또한  root 계정이 아닌 bitnami 사용자 계정의 크론탭 스케줄로 설정해뒀던 제 다른 서버의 경우에도 갱신이 잘 되었네요. 반드시 root의 스케줄로 등록할 필욘 없어보입니다.

 

24 댓글

  1. 분명 설정할 당시에는 스케줄러 확인했을 때 작동하는 걸 확인했는데, 시간이 지난 어느 시점에 확인해보면 ‘no crontab for ubuntu’ 메시지가 뜰 때가 있습니다. –renew-hook이 되기 전에 자연스러운 현상으로 봐야하는 부분인지, 아니면 스케줄이 초기화된 현상으로 다시 설정을 해줘야 하는지 궁금합니다. ^^

  2. 안녕하세요 ㅎ 인증서 만료되서 접속이 안되고 있어요 ㅜ,.ㅜ 자동연장까지는 안따라해봐서 만료되면 /etc/letsencrypt/live/도메인/fullchain.pem 하구 privkey.pem 삭제하고 다시 설정하면 되나요?? 만약 맞다면 삭제는 어떻게 해야하는지좀 ㅋ

    • 인증서 재발급은 말씀하신 폴더의 파일들을 모두 삭제하고 재발급받아도되고, 그냥 바로 재발급받아도 됩니다. 다만 짧은시간에 여러번은 시도 못하게 되어있어요

  3. crontab 수정을 할려면 어떻게 하나요?
    crontab -e 로 해서 수정하고 Ctrl+X 누르고 y 한 후 엔터 눌러도 same 어쩌고 하면서 y 누르면 다시 원래대로 돌아가고 그러네요
    아예 crontab 몽땅 삭제 하는 것도 좀 알려 주십시요

  4. 아 여기 글들 정말 도움이 너무너무 많이 됩니다^^
    항상 힘내시고 화이팅하세요~!!!

    • 안녕하세요 응원댓글 남겨주셔서 감사합니다. 최근 몇달간 제가 일자리가 바뀌어서 적응하느라 신경을 못썼네요. 감사합니ㅏㄷ.

  5. 항상 감사드립니다. 마지막 부분에서 다음과 같은 글이 나오는데, 어찌해야 할까요?

    crontab: installing new crontab
    “/tmp/crontab.b7gOIn/crontab”:23: bad minute
    errors in crontab file, can’t install.
    Do you want to retry the same edit? (y/n)

    y를 누르면 계속 똑같이 반복이 되네요. 도와주세요 ㅠㅠ

    • 보니깐 copy & paste 하는 과정에서 restart apache” 부분이 다음 줄로 바뀌어 붙여졌네요. 혹시 저와 같은 증상이 있으신 분은 확인해 보세요. 한줄로 바꾸니 정상 작동됩니다.
      감사합니다 ^^

  6. 정말 너무 감사합니다 ㅠ

    알기쉽게 설명해주신 덕분에 과정 마무리까지 많이 도움받았습니다!!!

    이제 시작이네요

    워드프레스 잘 만들어볼게요!!! 🙂

  7. 알려주신 방법대로 잘 설정했습니다! 감사합니다.
    하지만 로드밸런서로 인증서를 적용하기 위해 다시 원상태로 복구하고 싶은데
    인증서만 삭제하면 될까요? 아니면 복구 방법이 따로 있을까요?

  8. 이 사이트 글 보면서 워드프레스 설치며 여러가지 정보에 많은 도움을 얻고 있습니다.
    인증서 설치도 잘 되고, 리다이렉팅 주소 세팅까지 문제없이 잘 되었습니다.
    인증서 자동갱신을 등록하려고 하는데요, 위의 글처럼 따라 했는데

    6 5,10 * * * /home/bitnami/certbot-auto renew –renew-hook “sudo /opt/bitnami/ctlscript.sh restart apache” 명령어를 입력하니,
    bash: 6: command not found 이라는 문구가 나옵니다.

    certbot-auto 파일은 글의 위치와 같은 곳에 위치하고 있습니다.

  9. 안녕하세요.

    다름이 아니라 저장하는 부분에서 막혔는데요. 이전 글을 따라할 때까지만해도 Ctrl+X 키를 입력해 내용 저장이 가능했는데, https 인증서 설치 이후에 자동갱신 명령을 저장하려 하니

    Ctrl+X 키 입력시 저장 메뉴가 아닌 엑스 모드라는 메세지가 나옵니다.

    윈도우10 사용자이며, 라이트세일 SSH, cmd를 통한 파일 수정 모두 동일한 메세지를 노출하고 있는데 혹시 해결 방법을 아신다면 도움 부탁드립니다. ㅠㅠ

댓글은 익명이나 SNS, wordpress.com 로그인 지원). 마크다운 문법 사용가능(Shift+~ 키로 특정문구 혹은 위아래 ~~~으로감싸서 여러줄을 코드블락으로 작성)