1. OCSP Stapling 概述

1.1 什么是 OCSP?

OCSP 的全称是在线证书状态协议(Online Certificate Status Protocol)。说白了,它就是用来查一张数字证书有没有被吊销的。

我刚开始做 HTTPS 运维时,一直以为证书只要不过期就没事。后来有一次线上告警,Chrome 弹了「证书已被吊销」的红叉,我才意识到证书状态的实时验证有多重要。嗯,从那时起我就把 OCSP 加入了必检清单。

OCSP 的工作方式很直白:客户端(比如浏览器)拿到服务器证书后,主动去问 OCSP 响应器(通常由 CA 提供)——「喂,这张证书现在还有效吗?」响应器回答「有效」或「已吊销」。但这里有个问题:每次访问都要多一次网络请求,性能和隐私都受影响。

小知识点:RFC 6960 定义了 OCSP 协议标准。实际生产环境中,OCSP 响应器 URL 通常写在证书的 Authority Information Access (AIA) 扩展里。

1.2 什么是 OCSP Stapling?

OCSP Stapling 可以理解为「把 OCSP 响应提前打包好,塞进 TLS 握手里」。服务器在握手阶段主动把经 CA 签名的 OCSP 响应「钉」在 Certificate 消息后面发给客户端。客户端就不用再自己去查了。

我记得最早接触这个特性是在 Nginx 1.3.7 之后的版本。当时配置ssl_stapling on 后,HTTPS 握手时间肉眼可见地降下来了。为什么?因为省掉了一次额外的网络往返。

你想想看:如果没有 Stapling,客户端拿到证书后还得再发起一次 HTTP 请求去查状态。多了至少一个 RTT(往返时间),而且这个请求是明文的,还暴露了正在访问哪个站点。OCSP Stapling 把这些痛点全解决了。

核心区别一句话:
普通 OCSP → 客户端主动查(慢、泄露隐私)
OCSP Stapling → 服务器主动给(快、隐藏站点)

1.3 HTTPS 证书验证流程对比

为了让你直观理解差异,我画了一张流程图。左边是传统 OCSP 验证,右边是 OCSP Stapling 验证。注意看握手阶段多了一个步骤的区别。

HTTPS 证书验证流程:传统 OCSP vs OCSP Stapling 传统 OCSP 流程 OCSP Stapling 流程 客户端(浏览器) 服务器(Nginx) CA / OCSP 响应器 ① TLS ClientHello ② 发送证书 ③ OCSP 请求(额外 RTT) ④ OCSP 响应 验证完成,耗时多 1 RTT 客户端(浏览器) 服务器(Nginx) CA / OCSP 响应器 ① 定期预获取 OCSP 响应 ② 返回签名响应 ③ TLS ClientHello ④ 证书 + OCSP Stapling 响应(一次发送) 验证完成,零额外 RTT

1.4 为什么需要 OCSP Stapling?

说了这么多,到底解决了什么问题?我总结了三个核心价值:

  1. 性能提升:省掉一次额外的 HTTP 请求,对移动端和弱网环境特别明显。我曾在 3G 网络下测试,开启 Stapling 后 TLS 握手时间从 1.2 秒降到 0.6 秒。
  2. 隐私保护:传统 OCSP 请求会暴露你正在访问哪个网站(因为请求里带了证书序列号等信息)。Stapling 由服务器统一获取,客户端完全不和 CA 通信。
  3. 可靠性增强:如果 CA 的 OCSP 响应器挂了,传统方式会超时导致证书验证失败。Stapling 模式下,服务器可以缓存最新的响应,只要缓存没过期,用户依然能正常访问。
避坑提示:我曾经遇到过配置了 Stapling 但浏览器还是回退到普通 OCSP 的情况。排查后发现是服务器时间不同步导致的——OCSP 响应里有时间戳,偏差超过几分钟就会被视为无效。所以请务必保证 NTP 同步。

1.5 OCSP 响应缓存策略

服务器拿到 OCSP 响应后不会一直用。响应里有一个 nextUpdate 字段告诉服务器什么时候该重新获取。我个人习惯把这个缓存时间设为 nextUpdate 的 75%,留出余量防止过期时刚好请求高峰。

字段说明典型值
thisUpdate响应生成时间2025-01-15 10:00:00
nextUpdate下一次更新推荐时间2025-01-15 16:00:00
certStatus证书状态(good/revoked/unknown)good

你可能会问:如果缓存过期了但服务器还没来得及获取新响应怎么办?大多数 Web 服务器(Nginx、Apache)会允许使用过期的响应一段时间,同时后台异步刷新。这比直接丢弃导致握手失败要安全得多。

一句话总结:OCSP Stapling 是让服务器替你跑腿去查证书状态,然后把结果直接塞进握手包。既快又保密,是现代 HTTPS 性能优化中成本最低的改进之一。