1. OCSP 协议概述与工作原理

咱们这一章,先从最基础的东西聊起。说实话,OCSP 这个名字很多搞安全的同学都耳熟能详,但真正把它翻来覆去研究透的人不多。我最早接触它是在做 HTTPS 证书验证优化的时候,当时发现客户端每次握手都要去下载 CRL 列表,那叫一个慢。后来才意识到,OCSP 才是真正适合在线场景的方案。

1.1 为什么需要 OCSP?

数字证书会过期,也可能被提前吊销。过去主流方案是证书吊销列表(CRL),CA 机构定期发布一个大文件,里面列着所有已吊销的证书序列号。但 CRL 有几个痛点:文件越来越大、下载耗时、实时性差。你想啊,一个 CA 可能签了几百万张证书,每次客户端都得拉个几 MB 的列表,这在移动端简直灾难。

OCSP 就是来解决这个问题的。它允许客户端实时查询「某张证书此刻是否有效」,不用下载整个黑名单。说白了,就是个轻量级的在线状态检查协议。

对比项CRLOCSP
数据传输量完整列表,可能几 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 工作流程 OCSP 工作流程(客户端与服务端交互) 客户端(浏览器/APP) OCSP 响应器(CA 服务) ① 查询:证书序列号 + 颁发者信息 ② 响应:good / revoked / unknown + 签名 ③ 验证签名 & Nonce ④ 检查 thisUpdate & nextUpdate ⑤ 决定:放行 / 拒绝 关键决策逻辑 good + 签名有效 + Nonce一致 + 时间窗有效 → 放行 其他情况 → 拒绝(或回退到 CRL 检查)

⚠️ 注意: 上图中第 ④ 步的「时间窗检查」经常被新手忽略。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证书已被吊销(可能附带吊销时间、原因)拒绝连接,显示安全警告
unknownCA 无法确认该证书状态(可能不是它签发的)通常视为不安全,可回退到 CRL

我经历过一个真实案例:某合作方的 OCSP 响应器总是返回 unknown,原因是他们证书链里的中间 CA 配置错误。最终排查了三天才定位到是 OCSP 响应器没正确识别颁发者哈希。所以你看,状态码虽然简单,但背后的 CA 配置不能出错。

1.6 小结:OCSP 在证书验证中的位置

整体上,OCSP 是 HTTPS 证书验证链条里的一环。它解决的是「证书是否被吊销」这个动态问题。静态验证(证书格式、有效期、签名链)是通过浏览器本地信任库完成的,OCSP 则负责在线确认。两者缺一不可。