ssl_stapling on 无效的主因是未配 ssl_stapling_verify on 和 ssl_trusted_certificate,导致 nginx 静默禁用 ocsp stapling;必须确保 ssl_trusted_certificate 包含完整信任链、resolver 显式配置且带 valid=300s,并用 openssl s_client -status 实测验证。

直接说结论:ssl_stapling on 能显著缩短 TLS 握手时间,但**不配 ssl_stapling_verify on 和 ssl_trusted_certificate,等于白开**——Nginx 会 silently 禁用 stapling,连日志都不报错。
为什么 ssl_stapling 开了却没生效?
常见现象是:配置写全了,nginx -t 通过,nginx -s reload 成功,但用 openssl s_client -connect example.com:443 -status 查看,始终显示 OCSP Response Status: no response sent。
根本原因不是 DNS 或网络问题,而是:ssl_stapling_verify on 启用后,Nginx 会在启动时立即验证 ssl_trusted_certificate 文件是否能正确验证 OCSP 响应签名。如果该文件缺失、路径错误、内容不全(比如漏了中间证书),Nginx 就会静默关闭 stapling 功能,且不写 error log。
-
ssl_trusted_certificate必须是完整信任链:根 CA + 所有中间证书(顺序无关,但不能只放 server cert) - 它和
ssl_certificate不是同一个文件——后者是你的域名证书 + 中间证书(不含根),前者必须额外包含用于验证 OCSP 响应签名的根/中间公钥 - 推荐用证书供应商提供的
fullchain.pem或ca-bundle.crt,别自己拼
resolver 配置必须显式声明,且不能依赖系统 DNS
Nginx 的 OCSP 请求走的是自己的 DNS 解析器,完全无视 /etc/resolv.conf。漏配或配错 resolver,会导致 stapling 永远无法发起首次查询,后续所有缓存都无从谈起。
- 必须写成
resolver 8.8.8.8 1.1.1.1 valid=300s;这种格式(IPv4/IPv6 地址均可,但不能写域名) -
valid=300s是关键:它控制 DNS 缓存有效期,太短会频繁解析,太长(如设成 86400)可能导致 OCSP 响应过期后因 DNS 缓存未刷新而无法更新 -
resolver_timeout 5s要配,否则 DNS 查询卡住会阻塞整个 SSL handshake,用户感知为“HTTPS 页面加载慢”
验证是否真生效,别只信配置文件
光看 Nginx 配置是否写对没用,得实测响应流里有没有 OCSP 数据。最可靠方式是本地用 OpenSSL 抓一次握手:
openssl s_client -connect example.com:443 -status -servername example.com 2>&1 | grep -A 1 "OCSP response"
成功时你会看到类似:
OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
注意两个细节:
- 必须加
-servername example.com,否则 SNI 不触发,可能命中默认 server 块,拿到的不是目标站点的 stapling 响应 - 如果输出里只有
OCSP response: no response sent,说明 stapling 根本没装订进去,优先回头检查ssl_trusted_certificate文件内容和权限(Nginx worker 进程需可读)
容易被忽略的兼容性与降级行为
OCSP Stapling 不是“全有或全无”,Nginx 有一套静默降级逻辑:
- 首次请求时 DNS 解析失败 / OCSP 服务器超时 / 响应签名验证失败 → 当前连接不装订,但不中断 TLS 握手
- 后续请求仍会重试获取 OCSP 响应,只要某次成功,就会缓存并用于之后的握手(缓存时间由 OCSP 响应里的
nextUpdate字段决定,通常 24–48 小时) - 客户端不支持 OCSP stapling(如旧版 IE、Android 4.x WebView)→ 服务端照常发送,客户端自动忽略,不影响连接建立
真正要警惕的是:你把 ssl_stapling_verify on 配错了,又没做验证,结果线上跑了半年 stapling 始终没工作——性能和隐私收益全部落空,还误以为已优化到位。











