최근 Docker를 활용해 운영 중인 인증서에서 갱신 관련 경고 메일을 받기 시작했다.
내용은 인증서 만료일이 얼마 남지 않았다는 알림이었고, 처음엔 설정에 문제가 있을 거라고 생각하지 않았다.
하지만 직접 갱신 과정에서 실행해본 적이 없다는 사실을 떠올리면서, 자동 갱신이 실제로 정상적으로 동작하고 있는지 검증하지 않았다 생각이 떠올랐다.
이번 기회에 인증서를 자동으로 갱신하는 방식 자체를 점검하고, 필요한 부분은 수정해보기로 했다.
문제 상황 확인
우선, 정말 인증서가 제대로 갱신되고 있는지를 확인하기 위해 설정부터 점검해봤다.
// Update Dcoker Compose
// ...
volumes:
- ./certbot/conf:/etc/letsencrypt
// ...
volumes 설정을 통해 인증서 파일이 certbot/conf 경로에 동기화되고 있기 때문에,
해당 디렉토리로 이동해 현재 인증서 상태를 확인했다.
openssl x509 -in ./certbot/conf/live/seojaewan.com/fullchain.pem -noout -dates
출력된 결과는 다음과 같다.
notBefore=Mar 7 00:27:14 2025 GMT
notAfter=Jun 5 00:27:13 2025 GMT
내 설정에 따르면 인증서는 매주 월요일마다 갱신이 시도되어야 해서, 3월 31일 이전에 이미 한 번 이상 갱신됐어야 했다. 하지만 실제로는 3월 7일 이후로 갱신된 흔적이 전혀 없었다.
즉, 자동 갱신이 작동하지 않고 있었다는 걸 확인할 수 있었다.
해결 방법 고민
문제가 발생한 원인으로 추정되는 부분은 인증서를 도메인별로 개별 갱신하고 있는 부분이다.
version: "3.8"
services:
nginx:
volumes:
- ./nginx/nginx.certbot.conf:/etc/nginx/nginx.conf
certbot-mafia:
image: certbot/certbot
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d mafia-game.seojaewan.com --agree-tos
certbot-rhythm:
image: certbot/certbot
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d rhythm-up.seojaewan.com --agree-tos
certbot-along:
image: certbot/certbot
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d along.seojaewan.com --agree-tos
certbot-intro:
image: certbot/certbot
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d seojaewan.com --agree-tos
certbot-travelog:
image: certbot/certbot
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d travelog.seojaewan.com --agree-tos
certbot-travelog-api:
// ...
command: certonly --webroot -w /var/www/certbot --force-renewal --email sjw7324@gmail.com -d travelog-server.seojaewan.com --agree-tos
위와 같이 도메인마다 별도의 컨테이너를 만들어 각각 인증서를 요청하고 있었는데, 실제로는 앞선 인증서 갱신 작업이 완료되기도 전에 다음 인증 요청이 실행되면서 충돌 문제로 갱신이 제대로 이루어지지 않았던 것으로 보인다.
지금 와서 보면, 너무 무식하게(?) 설정해둔 것 같다는 생각이 든다.
문제를 해결할 방법을 찾던 중, 하나의 인증서에 여러 도메인을 함께 포함시켜서 발급받는 방식이 가능하다는 것을 알게 되었다.
즉, 모든 도메인을 각각 인증서로 관리하는 것이 아니라, 하나의 요청으로 필요한 도메인을 모두 한번에 처리하는 것이다.
이 방식을 사용하면 컨테이너를 여러 개 띄우지 않아도 되고, 인증서 갱신 타이밍이 겹쳐서 생기는 충돌도 방지할 수 있다.
해결하기
먼저, 기존에 개별로 발급되었던 인증서를 정리하기 위해 certbot의 delete 명령어를 사용해 불필요한 인증서를 삭제했다.
certbot delete --cert-name <이름>
delete 명령어를 사용하면 인증서와 관련된 파일을 깔끔하게 정리할 수 있다.
삭제 작업을 마친 후 새로운 방식으로 인증서를 통합 발급을 할 수 있도록 docker-compose를 수정했다.
command: >
certonly --webroot -w /var/www/certbot
--email sjw7324@gmail.com
--agree-tos
--cert-name seojaewan.com
-d seojaewan.com
-d www.seojaewan.com
-d mafia-game.seojaewan.com
-d rhythm-up.seojaewan.com
-d along.seojaewan.com
-d travelog.seojaewan.com
-d travelog-server.seojaewan.com
도메인 구조를 보면 모두 seojaewan.com의 서브 도메인이기 때문에, 인증서 이름은 seojaewan.com으로 지정하고, 해당 인증서에 필요한 모든 서브 도메인을 -d 옵션으로 포함시켰다.
최종적으로 새롭게 발급된 인증서가 실제로 갱신되는지 확인할 수 있었고, 이전처럼 충돌 문제 없이 안정적으로 관리되는 것을 확인했다.
이제 인증서 관리도 단순화되고, 추후 문제 발생 가능성도 줄어들었다.
'개발환경' 카테고리의 다른 글
개발 생활의 질을 올려주는 Husky (2) | 2025.01.04 |
---|---|
Github Actions로 배포 자동화하기 (3) | 2024.12.18 |
[개발환경] React Native 개발환경 구성 - Window (2) | 2022.05.23 |
[개발환경] TypeScript 세팅 (2) | 2022.04.14 |
[개발환경] 도커 환경 구성 - Window (1) | 2022.03.11 |