letsencrypt 인증서 자동갱신 + 오류해결

letsencrypt 인증서 자동갱신 + 오류해결
Photo by JJ Ying / Unsplash

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