피드로 돌아가기
Dev.toInfrastructure
원문 읽기
SSL 인증서 만료로 인한 6시간 장애 해결 및 Full-chain 모니터링 설계
How an expired SSL cert took down our checkout for six hours (and what I should have had watching)
AI 요약
Context
Let's Encrypt와 certbot 기반의 Auto-renewal 구조를 사용했으나, DNS API 장애로 인한 갱신 실패가 Log 모니터링 부재로 인해 묵인됨. 단순 HTTP 200 응답 코드만 확인하는 기존 Uptime 모니터링 방식으로는 SSL 인증서 만료 시 브라우저에서 발생하는 인증 오류를 감지하지 못하는 한계가 발생함.
Technical Solution
- TLS Handshake 직접 수행을 통한 Port 443 인증서 유효성 검증으로 HTTP 200 응답 기반의 거짓 양성(False Positive) 제거
- 단순 만료일 체크를 넘어 Root CA부터의 Full-chain Validation을 수행하여 중간 인증서 누락으로 인한 브라우저 오류 방지
- 30일 및 7일 단위의 다단계 Alert Threshold 설정을 통해 자동 갱신 실패 시 수동 개입을 위한 충분한 대응 시간 확보
- certbot의 --deploy-hook을 활용한 Heartbeat 메커니즘을 구축하여 갱신 성공 여부와 서비스 Reload 적용 상태를 동시 검증
- DNS-01 및 HTTP-01 검증 경로의 잠재적 실패 포인트(Rate limit, Firewall)를 고려한 주기적 --dry-run 테스트 환경 구축
실천 포인트
1. HTTP Ping 모니터링에서 SSL Verification 비활성화 여부 확인
2. 인증서 만료일 기반의 2단계(30일/7일) Alert 설정
3. Root CA-Intermediate-Leaf로 이어지는 Full-chain 유효성 검사 추가
4. --deploy-hook을 이용한 갱신 성공 Heartbeat 모니터링 구현
5. Staging 환경에서 certbot --dry-run 주기적 수행