본문으로 건너뛰기
개발 머꼬
개발 노트인프라·운영
hohyeon.dev27

인증서가 만료돼 사이트 전체가 경고 화면이 된 이유

  • #Engineering Note
  • #인프라·운영

문제 발생

어느 아침 모든 서브도메인이 인증서 만료 경고를 띄웠습니다. 확인해보니 인증서 파일은 갱신되어 있었습니다. nginx가 여전히 옛 인증서를 메모리에 들고 있었을 뿐입니다.

원인 분석

갱신과 적용은 다른 단계입니다. 대부분의 certbot 설치는 자동 갱신을 포함합니다 — 리눅스에서는 cron이나 systemd 타이머가 주기적으로 certbot renew를 실행합니다.

certbot renew는 만료가 임박한 인증서만 갱신합니다 — 4.0.0 기준으로 수명의 1/3 미만이 남았을 때 갱신 대상이 되므로, 자주 실행해도 대개 아무 일도 하지 않습니다. 여기까지는 잘 돌고 있었습니다.

문제는 그다음입니다. nginx는 시작할 때 인증서를 읽어 메모리에 들고 있습니다. 파일이 바뀌어도 다시 읽지 않으면 옛 인증서를 계속 제시합니다. certbot은 이 경우를 위해 훅을 제공합니다 — --deploy-hook은 갱신이 성공한 뒤에만 실행되는 동작을 지정합니다.

해결 방안

  1. 갱신 후 웹서버를 다시 읽히게 합니다.
certbot renew --deploy-hook "systemctl reload nginx"

한 번 지정하면 그 인증서의 갱신 설정 파일에 저장되어 이후 자동 갱신에도 적용됩니다.

  1. 반드시 --dry-run으로 먼저 검증합니다. 문서 권고 그대로, 자동 갱신에 의존하기 전에 실제 인증서에 영향을 주지 않고 앞으로의 갱신이 성공할지 확인합니다.
certbot renew --dry-run
  1. 만료를 모니터링합니다. 갱신 자동화와 별개로, 남은 일수를 주기적으로 확인해 임계값에서 알림을 받습니다. 이 알림이 있었다면 만료 당일이 아니라 2주 전에 알았을 문제입니다.

  2. 컨테이너 환경에서는 특히 확인합니다. 호스트에서 갱신하고 컨테이너 안 nginx가 파일을 마운트해 쓰는 구성이면, reload 대상이 호스트 서비스가 아니라 컨테이너입니다.

  3. 훅이 실패해도 조용하지 않게 합니다. reload 명령이 실패하면 갱신은 성공했는데 적용은 안 된 상태가 되고, 이는 이번과 정확히 같은 결말입니다. 훅 실패를 알림으로 받게 합니다.

  4. 인증서 갱신을 배포와 분리합니다. "배포할 때 어차피 재시작되니 괜찮다"는 가정은 배포가 뜸해지는 순간 무너집니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.