“SSL 인증서 발급 및 HTTPS 구축” 글에서 Certbot을 이용하여 Let’s Encrypt에서 SSL 인증서를 무료로 발급받고 Nginx를 설정하는 과정을 정리했다. 그렇지만 한가지 알아둘 것은 이 무료로 받은 인증서의 유효 기간이 90일이라는 것이다. 만료 전에 인증서를 재발급 받아야 하는데 매번 일일이 손으로 할 수는 없는 노릇이니 자동으로 하도록 설정을 해야 한다. 이 글에서는 crontab
으로 인증서 갱신을 자동화하는 방법을 정리한다.
인증서 갱신하는 방법
인증서를 갱신하는 방법은 간단하다. 우선 인증서의 만료일이 언제인지 확인을 해보고 간단하게 갱신 옵션만 적용하면 된다. 그렇지만 실제로 갱신하기 전에 한번 연습 삼아 갱신이 되는지 확인해 본다. renew 옵션 뒤에 –dry-run을 넣어주면 모의로 갱신을 해 본다. “Congratulation”이 나오면 성공이다. 이후 –dry-run을 빼고 갱신하면 된다.
인증서 만료일 확인
$ sudo certbot certificates
위 실행 결과를 보면 만료일(Expiry Date)과 며칠 남았는지 알 수 있다. 다음은 인증서 갱신을 모의로 시험해보자.
$ sudo certbot renew --dry-run
모의로 갱신해보고 성공하면 실제로 인증서를 갱신하면 된다.
$ sudo certbot renew
crontab으로 자동 갱신 설정하기
다음으로는 crontab
으로 인증서를 자동으로 갱신하도록 설정해보겠다. crontab
은 특정 시간에 특정 작업을 주기적으로 하도록 하는 스케줄러를 관리하는 툴이다. 아래는 기본 명령어들이다.
# 현재 설정된 crontab 내용 출력
$ sudo crontab -l
# crontab 내용 입력(편집). 저장 방법은 vi와 동일. 콜론(:)입력 후 wq입력하면 됨
$ sudo crontab -e
날짜 및 시간을 특정하기 위해서는 분, 시, 일, 월, 요일 순서로 차례로 넣은 후 수행할 인증서 갱신 명령어를 입력하면 된다. 날짜, 시간은 *
, -
, /
를 이용하여 정의한다. *
는 모든 것, -
는 범위(언제부터 언제까지), /
는 간격을 의미한다. 원하는 날짜, 시간을 정한 후 sudo crontab -e
를 수행한 후 입력한다. 갱신에 성공하면 nginx를 다시 시작을 해줘야 하므로 –renew-hook 를 사용했고 이 이후 "sudo systemctl restart nginx"
수행할 명령어를 넣었다.
# m h dom mon dow command
# 격월 1일 새벽4시에 $ certbot renew 수행하고, 갱신에 성공하면 nginx 다시시작
0 4 1 */2 * sudo /usr/bin/certbot renew --renew-hook "sudo systemctl restart nginx"
위 작업을 하면 /var/spool/cron/crontabs/root
파일에 저장된다. 이 파일을 수정해도 된다.
$ sudo nano /var/spool/cron/crontabs/root
** 아직 자동으로 동작하는지 확인은 안되었다. 갱신이 만료 30일 전부터 가능하니 한번의 주기를 놓치게 되면 갱신이 안되는 것이다. 따라서 만약 이 주기가 안되면 격월에서 매달로 바꾸고 대신 --force-renew
옵션을 넣어봐야겠다.