证书吊销是指在 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——已吊销的证书会在界面中标注。