1. OCSP Stapling 概述
1.1 什么是 OCSP?
OCSP 的全称是在线证书状态协议(Online Certificate Status Protocol)。说白了,它就是用来查一张数字证书有没有被吊销的。
我刚开始做 HTTPS 运维时,一直以为证书只要不过期就没事。后来有一次线上告警,Chrome 弹了「证书已被吊销」的红叉,我才意识到证书状态的实时验证有多重要。嗯,从那时起我就把 OCSP 加入了必检清单。
OCSP 的工作方式很直白:客户端(比如浏览器)拿到服务器证书后,主动去问 OCSP 响应器(通常由 CA 提供)——「喂,这张证书现在还有效吗?」响应器回答「有效」或「已吊销」。但这里有个问题:每次访问都要多一次网络请求,性能和隐私都受影响。
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 验证。注意看握手阶段多了一个步骤的区别。
1.4 为什么需要 OCSP Stapling?
说了这么多,到底解决了什么问题?我总结了三个核心价值:
- 性能提升:省掉一次额外的 HTTP 请求,对移动端和弱网环境特别明显。我曾在 3G 网络下测试,开启 Stapling 后 TLS 握手时间从 1.2 秒降到 0.6 秒。
- 隐私保护:传统 OCSP 请求会暴露你正在访问哪个网站(因为请求里带了证书序列号等信息)。Stapling 由服务器统一获取,客户端完全不和 CA 通信。
- 可靠性增强:如果 CA 的 OCSP 响应器挂了,传统方式会超时导致证书验证失败。Stapling 模式下,服务器可以缓存最新的响应,只要缓存没过期,用户依然能正常访问。
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)会允许使用过期的响应一段时间,同时后台异步刷新。这比直接丢弃导致握手失败要安全得多。