OCSP Stapling 能显著降低移动端 TLS 握手延迟,因其由服务端主动预取并装订 OCSP 响应,避免客户端在弱网环境下因 DNS 慢、丢包或防火墙拦截导致的 OCSP 查询超时、降级或握手卡顿;其生效关键在于 resolver 配置、完整信任链与 ssl_stapling_verify 强验证闭环。

OCSP Stapling 能显著降低移动端 TLS 握手延迟,但直接开 ssl_stapling on 很可能无效甚至引发超时或 502 —— 关键不在“开不开”,而在 resolver、信任链和响应验证是否闭环。
为什么移动端对 OCSP Stapling 更敏感?
移动网络 DNS 解析慢、丢包率高、防火墙拦截 OCSP 请求更普遍。客户端(尤其是 iOS Safari 和 Android Chrome)在证书验证阶段若无法快速获取 OCSP 响应,会等待数秒后降级为 CRL 或跳过验证,造成 TLS 握手卡在 CertificateStatus 阶段,首屏延迟直线上升。
而 Nginx 的 OCSP Stapling 是服务端主动“装订”响应,绕过客户端发起的那一次独立 HTTP 查询 —— 这正是移动端提速的核心杠杆。
常见错误现象:
- Chrome DevTools 的 Security 标签页显示 “Valid from … to … (OCSP: unknown)”
- 使用
openssl s_client -connect example.com:443 -status测试时,输出中无OCSP response:区块 - 抓包看到客户端在 TLS 握手完成后立即向
ocsp.digicert.com等地址发 HTTP GET
ssl_stapling 必须搭配 resolver 才能自动生效
Nginx 默认不带 DNS 解析能力,ssl_stapling on 后它需要知道去哪里查 OCSP 响应器地址(从证书的 Authority Information Access 扩展里提取),这就依赖 resolver 指令。
实操要点:
-
resolver必须写在http或stream块顶层,不能只放在server里 - 推荐用内网 DNS(如
10.0.0.2)或可信公网 DNS(如8.8.8.8),避免用127.0.0.1(Docker 容器内通常不可达) - 必须加
valid=300s,否则 Nginx 不缓存解析结果,每秒都重查 DNS,极易打爆 resolver -
resolver_timeout 5s是硬性要求:OCSP 查询本身超时就设为 5 秒,再长会导致握手阻塞
典型配置片段:
http {
resolver 10.0.0.2 valid=300s;
resolver_timeout 5s;
<pre class="brush:php;toolbar:false;">server {
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.pem;
# 其他 SSL 配置...
}
}
ssl_stapling_verify on 不是可选项,而是安全底线
开启验证后,Nginx 会用 ssl_trusted_certificate 中的 CA 证书去校验 OCSP 响应签名 + nextUpdate 时间戳。不启用它,攻击者可伪造响应文件导致吊销失效。
容易踩的坑:
-
ssl_trusted_certificate文件不能是你的服务器证书或 fullchain.pem —— 它只用于验证 OCSP 响应签名,必须只含根 CA + 中间 CA(顺序从根到叶),且不能混入任何其他证书 - 用
openssl verify -CAfile /etc/nginx/ssl/ca-bundle.pem -untrusted /etc/nginx/ssl/intermediate.pem ocsp_response.der手动验证是否能过 - 私有 CA 场景下,
resolver几乎必然失败(内网域名无法被公网 DNS 解析),此时必须改用ssl_stapling_file+ 定期openssl ocsp拉取
移动端真实生效的验证方式
别信 Nginx 日志或配置语法检查 —— 那些只说明“没报错”,不代表客户端收到了响应。
必须用终端命令交叉验证:
- 本地测试:
echo Q | openssl s_client -connect example.com:443 -status -servername example.com 2>&1 | grep -A 17 "OCSP response",看到Response verify OK才算闭环 - 真机抓包(iOS 需配描述文件 + Wireshark Remote Packet Capture):过滤
tls.handshake.type == 22,看 Server Hello 后是否紧跟着CertificateStatus消息 - WebPageTest(选真实 Android 设备):在 Connection View 中观察 TLS 握手时间是否稳定在 150ms 内,且无后续 OCSP HTTP 请求
最常被忽略的一点:OCSP 响应有效期(nextUpdate)通常只有 4 小时。Nginx 自动拉取机制一旦因网络抖动失败,就会沿用过期响应并拒绝装订 —— 此时客户端又退回自行查询。生产环境务必配合监控脚本检查 ssl_stapling 实际状态,而非只盯配置是否存在。











