Cron 을 사용하여 SSL 인증서 자동 갱신하기

Last updated on 2023. 06. 15.

예전에 http를 https로 바꾸는 방법을 정리한 적이 있습니다. 상세 내용은 아래 링크를 참조

http를 https로 변경하기 <– 링크 참조

Let’s Encrypt 에서 발급하는 인증서를 사용하고 있는데 한 가지 귀찮은 점이 있다면 90일마다 한 번씩 인증서 갱신을 해줘야 합니다. 90일이 지나버리면 보안 경고(?) 같은 것이 뜨면서 홈페이지 접속이 원활하지 않게 됩니다. 물론 이때 인증서 갱신을 해 주면 다시 잘 되긴 합니다.

이것을 cron을 사용하여 인증서 자동갱신하는 방법을 알아보겠습니다.

먼저 인증서 정보 및 만료일을 확인해 봅시다.

[pi@localhost ~] $ certbot certificates

그러면 인증서에 대한 정보를 볼 수 있습니다. 도메인 주소라든지 만료일 등을 확인 가능합니다.

이제 cron 명령어를 알아보겠습니다. cron은 주기적이고 반복적인 작업을 예약하는 것이라 생각하면 됩니다.

# 현재 설정 된 cron 작업 보기
[pi@localhost ~] $ crontab -l

# cron 작업 편집하기
[pi@localhost ~] $ crontab -e

# cron 작업 삭제하기
[pi@localhost ~] $ crontab -r

처음에 crontab -l 을 수행하면 “no crontab for user” 란 메시지를 띄우게 됩니다. 이제 crontab -e 를 사용하면 편집기의 종류를 선택하라는 메시지가 나옵니다. 저는 vi 편집기를 사용하기로 합니다. 그리고 주석의 맨 아래를 보면 다음과 같이 나옵니다.

# m h dom mon dow command

해당 내용 밑에 내용을 적으면 되는데, 일단 SSL 자동 갱신을 위해 제가 설정한 내용을 소개합니다. 이제 최선인지는 모르겠지만 이렇게 해 봅니다.

# m h dom mon dow command
0 4 1 * * sudo service apache2 stop
1 4 1 * * sudo letsencrypt renew
2 4 1 * * sudo service apache2 start

내용을 하나하나 설명해 보겠습니다.

첫 번째 필드(m)는 분(minute)을 의미합니다. 두 번째 필드(h)는 시(hour)를 의미합니다. 세 번째 필드(dom)는 일(day) 의미합니다. 네 번째 필드(mon)는 월(month)를 의미합니다. 다섯 번째 필드(dow)는 요일(weekday)을 의미합니다. 마지막으로 여섯 번째 필드(command)는 실행할 명령을 의미합니다.

Let’s Encrypt 는 80번 포트를 사용해서 인증서를 갱신하기 때문에 먼저 apache2 를 정지시킵니다. 첫 번째 라인은 0분 4시 1일 매달 (매요일) apache2 를 정지합니다.
그다음 라인은 1분 뒤 인증서를 갱신합니다. 1분 4시 1일 매달 (매 요일) 인증서를 갱신합니다. 이때 인증서 만료일이 30일 보다 길면 실제 인증서 갱신은 되지 않습니다.
마지막으로 1분 뒤 apache2를 재 실행합니다. 2분 4시 1일 매달 (매 요일) apache2 를 시작합니다.

물론 이렇게 하면 매달 새벽 4시에서 4시 2분까지 약 2분간 홈페이지가 다운되긴 하겠지만 그래서 사람들의 방문이 가장 적을 새벽 시간에 해당 작업을 걸어주는 게 좋겠습니다.

Cron 실행 주기 test는 https://crontab.guru 여기서 테스트해 볼수 있습니다.

뭐 이게 최적의 방법일지는 모르겠지만 이 홈페이지는 방문자도 많지 않고 개인 홈페이지라서 이렇게 SSL 자동갱신을 해 놓았습니다.