吊销机制原理:CRL与OCSP,到底怎么选?

证书吊销,说白了就是让一张本来有效的证书提前“作废”。你想想看,私钥泄露了、员工离职了、域名换了,证书还挂着,那跟没锁门有什么区别?

但问题来了——怎么知道一张证书被吊销了?总不能每次都打电话问CA吧?嗯,这就是我们今天要聊的核心:CRL 和 OCSP。

我在应急响应项目里见过太多因为吊销机制没配好,导致业务中断或者安全事件扩大的案例。所以这一章,咱们把这两个家伙的底裤都扒干净。

CRL:证书吊销列表

CRL 是最早的吊销查询方案。CA 会定期发布一个列表,里面写着所有被吊销证书的序列号。谁想验证证书,谁就去下载这个列表,然后自己比对。

核心逻辑:CA 签名 → 发布列表 → 客户端下载 → 本地比对。

CRL 的工作流程

  1. CA 生成 CRL:CA 把所有吊销证书的序列号、吊销时间、原因码打包,用自己的私钥签名。
  2. 发布 CRL:CRL 被放到一个公开的 URL(就是证书里的 CRL Distribution Points 字段)。
  3. 客户端下载:浏览器或应用在验证证书时,去这个 URL 拉取 CRL。
  4. 本地校验:客户端检查当前证书的序列号是否在 CRL 里。如果在,吊销;如果不在,继续。

我的经验:CRL 的更新周期很关键。我见过一个客户把 CRL 更新周期设成了 7 天,结果私钥泄露后,整整一周内所有新发的证书都在用那个泄露的密钥对做签名验证。你说吓不吓人?

CRL 的致命伤

  • 体积爆炸:CA 规模大了,CRL 可能几十 MB。移动端下载一次,流量和电量都扛不住。
  • 实时性差:CRL 是“快照”式的,更新周期内被吊销的证书,客户端根本不知道。
  • 单点压力:所有客户端都去同一个 URL 拉文件,CDN 没配好就是灾难。

注意:CRL 的签名验证不能省。我曾经在渗透测试中遇到过攻击者伪造 CRL 的情况——他们把吊销列表清空,然后重新签名(当然,私钥是偷来的)。客户端如果不验证 CRL 的签名,就会信任所有被吊销的证书。

OCSP:在线证书状态协议

OCSP 是 CRL 的升级版。它不下载整个列表,而是只问一句:“这张证书现在有效吗?”CA 的 OCSP 响应器回答:“有效”或“已吊销”。

核心逻辑:客户端发起查询 → OCSP 响应器实时判断 → 返回签名结果。

OCSP 的工作流程

  1. 客户端构造请求:把证书的序列号、颁发者信息打包,发给 OCSP 响应器(URL 在证书的 Authority Information Access 字段)。
  2. 响应器查询:OCSP 响应器查自己的数据库,判断这张证书是否被吊销。
  3. 返回响应:响应器用私钥签名结果,返回 good、revoked 或 unknown。
  4. 客户端验证:客户端验证 OCSP 响应的签名,然后做决策。

我建议:OCSP 响应器一定要做缓存和负载均衡。我在一个金融客户那里看到,OCSP 响应器直接裸奔,结果业务高峰期每秒几万次查询,响应器直接挂了,所有证书验证都超时——业务也跟着挂了。

OCSP 的坑

  • 隐私问题:每次查询都告诉 CA“我在访问哪个网站”,CA 可以拿到用户的浏览记录。
  • 可用性依赖:OCSP 响应器挂了,客户端怎么处理?很多浏览器直接“软失效”——跳过验证,信任证书。这等于白配。
  • 响应签名开销:每次响应都要签名,高并发下对 CA 的签名机是个考验。

避坑指南:我曾经处理过一个事件,攻击者利用 OCSP 响应器的“软失效”行为——他们 DDoS 了 OCSP 响应器,然后所有客户端都因为超时而跳过验证,直接信任了攻击者伪造的证书。所以,OCSP Must-Staple 一定要开,后面我们会细讲。

CRL 与 OCSP 对比分析

这两个方案没有绝对的好坏,只有适不适合。我一般这样选:

对比维度 CRL OCSP
数据获取方式 客户端主动下载完整列表 客户端发起单条查询
实时性 差(依赖更新周期) 好(实时查询)
网络开销 高(大文件下载) 低(小请求/响应)
隐私保护 好(不暴露查询目标) 差(暴露查询目标)
服务端压力 低(静态文件分发) 高(实时签名响应)
离线可用性 好(下载后可离线校验) 差(必须在线)
典型场景 内网、离线环境、IoT 互联网、高实时性要求

我的选择原则:如果业务对实时性要求高,选 OCSP + Must-Staple;如果环境是内网或离线,CRL 更靠谱。但说实话,现在主流做法是两者都配——CRL 做兜底,OCSP 做主查询。

核心逻辑图:CRL vs OCSP 工作流程对比

下面这张图把两个流程放在一起对比,你看一眼就明白了:

CRL vs OCSP 工作流程对比 CRL 流程 CA 生成 CRL 列表 发布到 CRL 分发点 客户端下载 CRL 本地比对序列号 返回吊销状态 OCSP 流程 客户端构造查询请求 发送给 OCSP 响应器 响应器实时查询数据库 签名并返回响应 客户端验证签名并决策 CRL 是“拉”模式,OCSP 是“问”模式。一个靠下载列表,一个靠实时查询。

实际部署中的选择建议

我这些年做 PKI 架构,总结了几条经验:

  • 互联网业务:OCSP + Must-Staple 是标配。CRL 作为 fallback,但别指望客户端会主动去下载。
  • 内网环境:CRL 更简单,部署一个内网 CRL 分发点就行。OCSP 在内网反而容易成为瓶颈。
  • 移动端/IoT:CRL 的增量更新(Delta CRL)是个好方案,只下载变化的部分,省流量。
  • 高安全场景:两个都上,而且要做监控——CRL 更新是否及时?OCSP 响应是否正常?

我的习惯:每次做 PKI 架构评审,我都会问一个问题:“如果 CRL 分发点挂了,或者 OCSP 响应器挂了,你的业务会怎么样?” 90% 的人答不上来。嗯,这就是我们需要做应急响应的原因。