證書吊銷是指在 SSL 證書到期之前使其失效的過程——通常是因為私鑰洩露、證書被錯誤簽發,或域名所有權發生變更。
理論上,吊銷是 CA 體系應對緊急情況的方式。但實際上,它是 PKI 基礎設施中最薄弱的環節。以下是原因,以及正在替代它的方案。
何時需要吊銷證書
- 私鑰洩露 —— 金鑰被洩露、竊取或暴露(例如提交到公開的 Git 倉庫)
- 證書錯誤簽發 —— CA 為你不控制的域名簽發了證書
- 域名轉讓 —— 你不再擁有證書所覆蓋的域名
- 金鑰輪換 —— 你正在輪換金鑰並希望廢棄舊證書
- 伺服器退役 —— 證書不應再有效
吊銷的工作原理
CRL(證書吊銷列表)
這是最早的吊銷機制。CA 釋出所有已吊銷證書序列號的列表,瀏覽器下載該列表並進行比對。
問題:
- CRL 會隨時間增長變得非常大(數百萬條記錄)
- 瀏覽器必須在驗證證書之前下載整個列表
- 速度慢且消耗頻寬——大多數瀏覽器多年前就已停止檢查 CRL
OCSP(線上證書狀態協議)
實時查詢機制。瀏覽器不再下載列表,而是向 CA 的 OCSP 伺服器詢問:“這個證書是否被吊銷了?”
工作流程:
Browser → OCSP Responder: "Is cert serial #12345 still valid?"
OCSP Responder → Browser: "Good" / "Revoked" / "Unknown"
問題:
- 隱私 —— CA 能知道你正在訪問哪些網站(它們能看到每個 OCSP 請求)
- 延遲 —— 每個新的 HTTPS 連線都增加一次網路往返
- 可用性 —— 如果 OCSP 響應器宕機,瀏覽器通常會軟失敗(仍然接受證書),導致吊銷機制形同虛設
OCSP Stapling(改進方案)
由伺服器定期獲取 OCSP 響應並將其”裝訂”到 TLS 握手中。瀏覽器無需聯絡 CA 即可獲得吊銷狀態。
優勢:
- 無隱私洩露(瀏覽器不會聯絡 CA)
- 無額外延遲(響應與握手捆綁傳送)
- 即使 CA 的 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 Stapling 嗎?
應該。它不能保證吊銷檢查有效(瀏覽器可能忽略它),但整體上是有益的:更快的 TLS 握手(無需用戶端查詢 OCSP)、更好的隱私(瀏覽器不聯絡 CA),且部分瀏覽器確實會遵循裝訂的 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——已吊銷的證書會在介面中標註。