피드로 돌아가기
How an expired SSL cert took down our checkout for six hours (and what I should have had watching)
Dev.toDev.to
Infrastructure

SSL 인증서 만료로 인한 6시간 장애 해결 및 Full-chain 모니터링 설계

How an expired SSL cert took down our checkout for six hours (and what I should have had watching)

SamReid2026년 5월 22일6intermediate

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 주기적 수행

원문 읽기