인증서 폐기란 SSL 인증서를 만료일 이전에 무효화하는 절차입니다. 주로 개인키가 침해되었거나, 인증서가 잘못 발급되었거나, 도메인 소유권이 변경되었을 때 수행합니다.
이론적으로 폐기는 인증 기관 시스템이 비상 상황에 대응하는 방식입니다. 하지만 실제로는 PKI 인프라에서 가장 취약한 부분입니다. 그 이유와 이를 대체하고 있는 방법을 알아보겠습니다.
인증서를 폐기해야 하는 경우
- 개인키 침해 — 유출, 도난, 또는 노출된 경우(예: 공개 Git 저장소에 커밋)
- 인증서 오발급 — 인증 기관이 귀하가 관리하지 않는 도메인에 대한 인증서를 발급한 경우
- 도메인 매각 — 인증서가 적용된 도메인을 더 이상 소유하지 않는 경우
- 키 교체 — 키를 로테이션하면서 이전 인증서를 무효화하려는 경우
- 서버 폐기 — 인증서가 더 이상 유효하지 않아야 하는 경우
폐기 작동 방식
CRL (인증서 폐기 목록)
최초의 폐기 메커니즘입니다. 인증 기관이 폐기된 모든 인증서 시리얼 번호 목록을 공개합니다. 브라우저가 이 목록을 다운로드하여 대조 확인합니다.
문제점:
- CRL은 시간이 지남에 따라 매우 커집니다(수백만 건의 항목)
- 브라우저가 인증서를 검증하기 전에 전체 목록을 다운로드해야 합니다
- 느리고 대역폭을 많이 소비합니다 — 대부분의 브라우저는 수년 전에 CRL 확인을 중단했습니다
OCSP (온라인 인증서 상태 프로토콜)
실시간 확인 방식입니다. 목록을 다운로드하는 대신 브라우저가 인증 기관의 OCSP 서버에 직접 질의합니다: “이 인증서가 폐기되었나요?”
작동 방식:
Browser → OCSP Responder: "Is cert serial #12345 still valid?"
OCSP Responder → Browser: "Good" / "Revoked" / "Unknown"
문제점:
- 개인정보 — 인증 기관이 귀하가 어떤 사이트를 방문하는지 알 수 있습니다(모든 OCSP 요청을 볼 수 있으므로)
- 지연 시간 — 모든 새로운 HTTPS 연결에 네트워크 왕복이 추가됩니다
- 가용성 — OCSP 응답 서버가 다운되면 브라우저는 일반적으로 소프트 페일(인증서를 그냥 수락)합니다. 이로 인해 폐기가 사실상 무력화됩니다
OCSP 스테이플링 (개선된 방식)
서버가 OCSP 응답을 주기적으로 가져와서 TLS 핸드셰이크에 “스테이플”(첨부)합니다. 브라우저는 인증 기관에 연락하지 않고도 폐기 상태를 확인할 수 있습니다.
장점:
- 개인정보 유출 없음(브라우저가 인증 기관에 연락하지 않음)
- 추가 지연 없음(응답이 핸드셰이크에 포함됨)
- 인증 기관의 OCSP 서버가 느리거나 다운되어도 작동
설정:
Nginx:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
Apache:
SSLUseStapling on
SSLStaplingCache "shmcb:/var/run/apache2/ssl_stapling(128000)"
CRLite (미래의 방식)
Mozilla의 CRLite는 알려진 모든 폐기 정보를 압축 필터(~1.5 MB)로 만들어 Firefox 업데이트와 함께 배포합니다. 브라우저가 로컬에서 폐기 상태를 확인할 수 있어 네트워크 요청도 없고, 개인정보 유출도 없으며, 지연도 없습니다. 2026년 현재 CRLite는 Firefox에서 활성화되어 있으며 다른 브라우저에도 도입될 수 있습니다.
폐기에 대한 불편한 진실
폐기는 실제로 대부분 작동하지 않습니다:
- Chrome은 기본적으로 OCSP나 CRL을 확인하지 않습니다(자체 CRLSets — 선별된 하위 집합에 의존)
- Safari는 OCSP를 확인하지만 소프트 페일합니다(OCSP 서버에 연결할 수 없으면 인증서를 수락)
- Firefox는 CRLite를 사용합니다(가장 좋은 방식이지만 Firefox 전용)
- OCSP 소프트 페일은 공격자가 OCSP 확인을 차단하면 브라우저가 폐기된 인증서를 수락한다는 것을 의미합니다
이것이 업계가 주요 방어 수단으로 단기 인증서로 전환하고 있는 이유입니다:
| 방식 | 보호 방법 |
|---|---|
| 폐기 (OCSP/CRL) | 침해된 인증서를 무효화 — 그러나 확인이 불안정 |
| 짧은 유효기간 (90일 → 47일) | 침해된 인증서가 빠르게 만료 — 확인 불필요 |
인증서의 유효기간이 47일뿐이라면 도난당한 키는 최대 47일만 사용할 수 있습니다. 이는 폐기가 작동하지 않더라도 피해를 제한합니다.
Let’s Encrypt 인증서 폐기 방법
개인키가 침해된 경우:
# With Certbot
sudo certbot revoke --cert-path /etc/letsencrypt/live/yourdomain.com/cert.pem --reason keycompromise
# With acme.sh
acme.sh --revoke -d yourdomain.com
폐기 후에는 즉시 새 인증서를 발급받으세요 — 폐기는 문제를 해결하는 것이 아니라 이전 인증서를 무효화할 뿐입니다. GetHTTPS를 사용하여 새로운 키 쌍으로 새 인증서를 발급받으세요.
자주 묻는 질문
OCSP 스테이플링을 활성화해야 하나요?
네. 폐기 확인을 보장하지는 않지만(브라우저가 무시할 수 있음) 전반적으로 긍정적입니다: 더 빠른 TLS 핸드셰이크(클라이언트 측 OCSP 조회 불필요), 더 나은 개인정보 보호(브라우저가 인증 기관에 연락하지 않음), 일부 브라우저는 스테이플된 OCSP 응답을 존중합니다. 활성화하는 데 비용이 들지 않습니다 — Nginx와 Apache에서 2-3줄의 설정으로 지원됩니다.
폐기가 적용되는 데 얼마나 걸리나요?
CRL은 주기적으로 공개됩니다(수 시간에서 수일). OCSP 응답은 캐시됩니다(일반적으로 1-4시간). 실제로 폐기된 인증서가 일부 브라우저에서 최대 24시간 동안 “유효”로 남아 있을 수 있습니다. 이것이 단기 인증서가 주요 방어 수단으로 폐기를 대체하고 있는 또 다른 이유입니다.
갱신할 때 폐기가 필요한가요?
아니요. 새 인증서를 발급받는 것에 이전 인증서를 폐기할 필요는 없습니다. 이전 인증서는 단순히 만료됩니다. 폐기는 개인키가 침해된 경우에만 필요합니다 — 정기적인 갱신에는 필요하지 않습니다.
인증서가 폐기되었는지 확인할 수 있나요?
# Check OCSP status
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -status 2>/dev/null | grep "OCSP Response Status"
# "successful" = OCSP stapling is working
# If empty, stapling is not enabled
또는 crt.sh에서 확인할 수 있습니다 — 폐기된 인증서는 인터페이스에 표시됩니다.