Nginx 不对 OCSP Stapling 中的 tryLater 做主动重试,该逻辑由 OpenSSL 在 TLS 握手时处理:每次新连接尝试获取一次响应,失败则不缓存、不重发,仅可能降级使用过期旧响应。

Nginx 本身不参与 TLS 层的 OCSP Stapling 流程重试,也不会对 OCSP 响应中的 tryLater(HTTP 状态码 503 或 OCSP 响应体中的 status: tryLater)做主动重试。所谓“Nginx 重试机制”在此场景下是常见误解——OCSP Stapling 的失败处理逻辑由 OpenSSL(或 BoringSSL)在 SSL handshake 阶段内部完成,Nginx 仅作为配置载体和缓存代理,不解析、不拦截、不重发 OCSP 请求。
排查重点不是“Nginx 怎么重试”,而是:OCSP 响应是否被成功获取并缓存?失败时 Nginx 如何表现?是否影响 TLS 握手?
以下是分步排查路径:
确认 OCSP Stapling 是否启用且配置有效
检查 server 或 http 块中是否明确开启,并指向正确证书链:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/fullchain.pem; # 必须含 issuer 证书,用于验证 OCSP 响应签名 resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s;
⚠️ 注意:ssl_trusted_certificate 不是 ssl_certificate,必须包含签发该证书的 CA 公钥(通常为中间证书 + 根证书组合),否则 OCSP 响应验签失败,直接跳过 stapling。
查看 Nginx 错误日志中的 OCSP 相关线索
开启 debug 日志(临时)可捕获底层行为:
error_log /var/log/nginx/error.log debug;
然后观察日志中是否出现类似条目:
-
OCSP response error: "tryLater" -
no responder URL in certificate(证书未嵌入 OCSP Responder 地址) -
certificate does not have an OCSP responder URL -
SSL_do_handshake() failed (SSL: ... OCSP response verification failed) -
stapling ignored, no valid OCSP response
这些说明 OpenSSL 已收到 tryLater,但因策略限制(如无备用响应、超时、验签失败)未缓存,Nginx 就不会 stapling。
理解 OpenSSL 对 tryLater 的实际处理逻辑
OpenSSL(1.1.1+)在收到 OCSP 响应中 status: tryLater 时:
- 不缓存该响应
- 不触发重试(OpenSSL 本身不实现重试,只返回失败)
- 下次 TLS 握手时,会重新发起 OCSP 请求(前提是
ssl_stapling开启且缓存未命中) - 若连续多次失败,OpenSSL 可能降级为使用本地缓存的旧响应(如果存在且未过期),或完全放弃 stapling(取决于
ssl_stapling_responder和超时设置)
✅ 所以“重试”本质是:每次新连接尝试获取一次 OCSP 响应,不是单次请求内反复重发。
验证 OCSP Responder 是否可达及响应行为
用命令行模拟请求,确认服务端真实返回:
# 提取证书中的 OCSP URL(需安装 openssl) openssl x509 -in your_cert.pem -noout -text | grep -A1 "OCSP" # 手动请求(替换 URL 和证书) openssl ocsp -issuer ca.pem -cert your_cert.pem -url http://ocsp.example.com -text
若返回 Response Verify Failure 或 tryLater,说明 OCSP 服务器临时拒绝,此时需联系 CA 或检查网络策略(如防火墙拦截 UDP 与 TCP 的 OCSP 端口)。
降低对 OCSP 实时性的依赖(实用兜底)
避免因 tryLater 导致握手延迟或失败,推荐配置:
ssl_stapling_cache shared:StaplingCache:128k; # 启用 stale 响应:即使 OCSP 新响应失败,仍可用过期但可信的旧响应 ssl_stapling_file /var/lib/nginx/ocsp/staple.der; # 可选,预加载初始响应
配合定期后台脚本刷新 OCSP 响应(如用 socat + openssl ocsp 定时拉取并写入 ssl_stapling_file),可彻底规避 tryLater 影响。
不复杂但容易忽略


















