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

0

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

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

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

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

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

 

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

분단위 시간단위 몇일 몇월 요일(0~7,월요일은1) 실행할명령어

 

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 아파치웹서버_재실행_명령어

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

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

이제 위의 저 한 줄을 크론탭에 작성해주면 됩니다.  nginx 서버 사용자의 경우 여기 글(링크)을 참고 하여 크론탭 명령어를 작성해주세요.

 

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

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

크론탭에 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편집기에서 스케줄을 작성해줍니다.

스케줄 작성 완료 화면

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

이제 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의 스케줄로 등록할 필욘 없어보입니다.

관련 포스팅

댓글을 남겨주세요.(익명, 구글, wordpress,페이스북, 트위터 계정 로그인 지원) 마크다운 문법 사용가능