1. OCSP 协议概述与工作原理
咱们这一章,先从最基础的东西聊起。说实话,OCSP 这个名字很多搞安全的同学都耳熟能详,但真正把它翻来覆去研究透的人不多。我最早接触它是在做 HTTPS 证书验证优化的时候,当时发现客户端每次握手都要去下载 CRL 列表,那叫一个慢。后来才意识到,OCSP 才是真正适合在线场景的方案。
1.1 为什么需要 OCSP?
数字证书会过期,也可能被提前吊销。过去主流方案是证书吊销列表(CRL),CA 机构定期发布一个大文件,里面列着所有已吊销的证书序列号。但 CRL 有几个痛点:文件越来越大、下载耗时、实时性差。你想啊,一个 CA 可能签了几百万张证书,每次客户端都得拉个几 MB 的列表,这在移动端简直灾难。
OCSP 就是来解决这个问题的。它允许客户端实时查询「某张证书此刻是否有效」,不用下载整个黑名单。说白了,就是个轻量级的在线状态检查协议。
| 对比项 | CRL | OCSP |
|---|---|---|
| 数据传输量 | 完整列表,可能几 MB | 单条查询响应,几百字节 |
| 实时性 | 按周期更新,有滞后 | 准实时,秒级响应 |
| 隐私性 | 暴露所有证书状态 | 暴露单个证书查询 |
| 服务器压力 | 高,全量推送 | 按需查询,可扩展 |
核心思路: OCSP 用「问-答」模式替代「拉表」模式。客户端只问它关心的那张证书,服务端只回答那一个结果。带宽节省 99% 以上。
1.2 OCSP 协议的请求与响应结构
OCSP 底层走的是 ASN.1 编码(DER 或 BER),用 HTTP 传输时通常 POST 一个二进制请求,得到二进制响应。不过为了方便理解,我建议你先把它看作一个简单的 RPC 调用。
请求体包含什么?
- 协议版本(目前只有 v1)
- 目标证书的颁发者信息(哈希值)
- 目标证书的序列号
- 可选扩展(如 Nonce 防重放)
我记得刚开始学的时候,差点被 ASN.1 的结构搞懵。后来发现直接用 OpenSSL 命令就能看明白:
# 生成一个 OCSP 请求(DER 文件)
openssl ocsp -issuer ca.pem -cert target.pem -reqout ocsp.req -text
# 查看请求的可读内容
openssl ocsp -reqin ocsp.req -text
响应体包含什么?
- 证书状态:good(有效)、revoked(已吊销)、unknown(未知)
- 本次响应的更新时间(thisUpdate)
- 下次更新建议时间(nextUpdate)
- 对请求里 Nonce 的回显(如果有)
- CA 对响应的数字签名
小技巧: 线上环境建议给 OCSP 响应加 Nonce,防止攻击者重放旧响应欺骗客户端。我自己遇到过因为没加 Nonce,导致被中间人用两小时前的旧「good」响应骗过的案例。
1.3 OCSP 工作流程:从握手到验证
下面咱们画个流程图,把整个交互理清楚。你一看就懂:
⚠️ 注意: 上图中第 ④ 步的「时间窗检查」经常被新手忽略。OCSP 响应有有效期,但你客户端系统时间如果偏差太大,可能把还在有效期内的响应当成过期,或者反过来把旧响应当成新响应。我建议你开启 NTP 同步,并且允许 ±5 分钟的时间容差。
1.4 OCSP Stapling:把查询挪到服务端
纯 OCSP 有个隐私问题:客户端每次连接都去 CA 查状态,CA 就知道你正在访问哪个站点。另外,多一次 HTTP 查询就多一次延迟。于是有了 OCSP Stapling。
思路很简单:由 Web 服务器定期向 CA 拉取 OCSP 响应,然后在 TLS 握手时「订书钉」似的夹带在 Certificate 消息里发给客户端。 客户端收到后直接验证签名,不再主动去查 CA。
嗯,这里要注意:服务器拿到的响应是有有效期的,通常几小时。如果响应过期了服务器还继续 stapling 旧响应,客户端就会拒绝连接。我在项目里就踩过这个坑——Nginx 配置了 ssl_stapling on,但忘了配 ssl_stapling_responder,结果默认去查 CA 主站,内网无法访问,响应一直是空的……折腾了半天才发现。
1.5 常见的 OCSP 响应格式差异
| 响应状态 | 含义 | 客户端如何处理 |
|---|---|---|
| good | 证书当前有效,未被吊销 | 正常建立连接 |
| revoked | 证书已被吊销(可能附带吊销时间、原因) | 拒绝连接,显示安全警告 |
| unknown | CA 无法确认该证书状态(可能不是它签发的) | 通常视为不安全,可回退到 CRL |
我经历过一个真实案例:某合作方的 OCSP 响应器总是返回 unknown,原因是他们证书链里的中间 CA 配置错误。最终排查了三天才定位到是 OCSP 响应器没正确识别颁发者哈希。所以你看,状态码虽然简单,但背后的 CA 配置不能出错。
1.6 小结:OCSP 在证书验证中的位置
整体上,OCSP 是 HTTPS 证书验证链条里的一环。它解决的是「证书是否被吊销」这个动态问题。静态验证(证书格式、有效期、签名链)是通过浏览器本地信任库完成的,OCSP 则负责在线确认。两者缺一不可。