第一讲:OCSP 协议基础与工作原理
先聊聊我为什么要把 OCSP 放在第一课。
几年前有个线上支付系统,每天凌晨批量跑证书验证。突然有一天,系统报了大量“证书吊销状态未知”的错误。查到最后,发现是 OCSP 响应器超时了。当时团队里一半人不知道 OCSP 是什么,另一半人只知道它“比 CRL 快”。嗯,从那以后我养成了一个习惯——讲 OCSP 必须先讲清楚它到底怎么工作的,不然出了超时问题你连日志都看不懂。
1.1 什么是 OCSP?
OCSP(Online Certificate Status Protocol)是 RFC 6960 定义的协议。说白了就是问你手里这张证书,现在有没有被吊销。你的客户端发一个请求给 OCSP 响应器(Responder),响应器告诉你“证书有效”“已吊销”或者“我不知道”。
为什么不用传统的 CRL(证书吊销列表)?
- CRL 是个大文件——CA 把所有吊销的证书序列号列出来,客户端下载后自己匹配。如果你有几千个证书要检查,下载一次可能几十兆。
- CRL 有更新延迟——通常 24 小时甚至更久才更新一次。有些场景要求实时性,比如金融交易、电子签名。
- OCSP 是实时查询——只查一张证书,响应体很小(几百字节)。你说哪个更适合生产环境?
核心区别一句话:CRL 是“你下载我发布的黑名单”,OCSP 是“你问我答,只针对你关心的那张证书”。
1.2 OCSP 请求长什么样?
请求是 ASN.1 编码的,但你不必成为 ASN.1 专家。我把它拆成几个关键字段:
| 字段 | 说明 | 个人关注点 |
|---|---|---|
| CertID | 包括颁发者哈希、颁发者名称、证书序列号 | 哈希算法要匹配响应器的配置,否则响应会带错误 |
| Extensions | 可选,可以请求扩展信息(比如 Nonce) | Nonce 防重放,我建议生产环境必加 |
| Signature | 请求也可以签名(但多数场景不签) | 增加开销,除非你真的很在意来源真实性 |
这里有个坑:我曾经遇到一个项目,OCSP 请求里没带 Nonce,结果响应器缓存的旧响应被重放攻击利用了。后来我把 Nonce 加上,问题就解决了。
1.3 OCSP 响应的三种状态
响应结构也类似,最核心的是 certStatus 字段。它只有三个值:
- good——证书未被吊销,也没过期。注意!它不代表证书本身有效(比如签名验证仍然要做)。
- revoked——已吊销,附带吊销时间、原因(比如私钥泄露)。
- unknown——响应器不认识这张证书。可能配置没同步,或者 CA 不对。
注意:收到“good”不代表你一定能信任证书。OCSP 只回答吊销状态,证书的签名、有效期、信任链还需要你自己验证。
另外,响应里还包含 thisUpdate 和 nextUpdate 两个时间戳。它们决定了客户端可以缓存这个结果多久。我个人习惯把缓存时间设成 nextUpdate 的一半,既减少请求次数,又避免过度信任过期响应。
1.4 完整的交互流程
我用一张图把全过程串起来——这也是本章唯一的图,你看一遍就能记住。
步骤③有一个容易被忽视的细节:响应器可能将结果缓存起来(比如缓存 10 分钟),然后直接返回缓存结果,不再查 CA。如果你在生产环境发现响应超时,很可能不是因为 CA 慢,而是响应器自己处理不过来——它内部要签名响应、查缓存、读写日志,每一步都可能成为瓶颈。
1.5 为什么 OCSP 会超时?
虽然本章只讲基础,但我提前给你一张“超时原因清单”,后面章节会逐个拆解:
- 网络延迟——客户端与响应器之间的 RTT 太大,尤其是在跨地域部署时。
- 响应器负载过高——大量并发请求,响应器来不及处理,甚至丢包。
- DNS 解析失败——响应器的 URL 是通过证书的 AIA 扩展得到的,DNS 出问题就根本连不上。
- 响应器不可用——机器挂了、证书过期、防火墙拦截。
- 客户端超时设置不合理——默认 1 秒超时,但实际响应需要 2 秒。这时候别怪 OCSP 慢,先看看你的 timeout 是不是太短了。
我的避坑经验:我曾经把客户端的超时从 3 秒改成 5 秒,结果请求量翻了一倍?仔细一看,原来之前超时后的重试机制又发了一次请求。超时不是越长越好,要配合重试策略一起调。
1.6 本章小结
OCSP 不是什么黑魔法。它的使命就是回答一个问题:“这张证书现在吊销了吗?”
你只需要记住:
— 请求带 CertID,最好加 Nonce。
— 响应三种状态:good / revoked / unknown。
— 缓存时间在 thisUpdate 和 nextUpdate 之间,取一半相对稳妥。
— 超时的根源往往在网络、负载、配置三个点上。
理解这些,当你在生产环境遇到 OCSP 超时,至少能看懂日志,知道是请求没发出去,还是响应没回来,还是回来的状态不对。剩下的,后面课程一个一个手把手解决。