letsencrypt 인증서 자동갱신 + 오류해결
letsencrypt는 http 통신을 위한 ssl인증서를 무료로 제공해준다. 다만 이것의 유효기간은 3개월 밖에 되지 않는데, 공식 홈페이지에 따르면 이는 자동갱신 세팅
을 유도하기 위해 일부러 그렇게 정한 것이라고 한다.
cron 세팅
우선 기존의 root권한의 cron 설정은 sudo crontab -l
으로 확인할 수 있다.
아직 certbot renew 명령어가 특별히 없는 것을 확인한 다음 수정을 시작하자.
sudo crontab -e
이렇게 하면 시스템 기본 에디터가 뜨기 때문에 vim 에디터가 뜨기도 한다. 자주 쓰지 않는 사람이라면 종료 조차 어색할 수 있는데 ! 입력후 q<enter>를 입력하면 나갈 수 있다.
키보드로 이동도 가능하고 좀 더 gui 에디터와 비슷한 nano
를 쓰려면
sudo VISUAL=nano crontab -e
이렇게 입력해야한다. 여기에 한달에 한번 갱신하도록 다음 문장을 추가하자.
# 매월 1일 1시 0분 인증서 갱신
0 1 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart nginx"
뒷부분은 renew가 성공한 후 nginx를 재시작하는 문구이다. letsencrypt는 유효기간이 한달 넘게 남은 인증서는 자동으로 skip하고 얼마 안남은 인증서만 갱신하기 때문에 이를 일주일 단위로 더 자주 해도 상관없다.
cron 오류와 해결
정상적이라면 인증서가 갱신되었을텐데 인증서가 만료되어간다는 email을 받았다. 그래서 letsencrypt 오류를 확인하고 해결해야 했다.
오류메시지는 cat /var/log/letsencrypt/letsencrypt.log.4
로 확인할 수 있다. 해당 폴더에는 지금 쌓이고 있는 로그파일도 있고 rotation에 의해 밀려난 로그파일들도 있다. 시각이 남으므로 1일에 실행된 로그를 찾아서 열어본다.
여러 도메인이 있다면 하나의 메시지는 다음과 같이 시작한다. 검색할 때 참고 가능.
2023-05-01 01:00:02,369:DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): r3.o.lencr.org:80
2023-05-01 01:00:02,763:DEBUG:urllib3.connectionpool:http://r3.o.lencr.org:80 "POST / HTTP/1.1" 200 503
2023-05-01 01:07:27,232:DEBUG:certbot._internal.plugins.disco:No installation (PluginEntryPoint#nginx): Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.
Traceback (most recent call last):
File "/opt/certbot/lib/python3.8/site-packages/certbot/_internal/plugins/disco.py", line 127, in prepare
self._initialized.prepare()
File "/opt/certbot/lib/python3.8/site-packages/certbot_nginx/_internal/configurator.py", line 194, in prepare
raise errors.NoInstallationError(
certbot.errors.NoInstallationError: Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.
nginx 경로를 찾지 못했다는 오류이다.
cron이 실행될 때 nginx의 경로는 현재 PATH와 별도로 cron 설정내에 별도로 잡아주어야 한다. 우선 nginx의 경로를 확인한다.
$ which nginx
/usr/sbin/nginx
다시 sudo VISUAL=nano crontab -e
로 cron 설정을 연 다음 경로를 추가해준다.
PATH=/usr/bin:/user/sbin:$PATH
cron 설정은 수정 후 즉시 반영된다고는 하지만 혹시 찜찜한 사람은 아래 명령어를 참고하자.
sudo systemctl restart cron
sudo systemctl reload cron