必须用openssl s_client实测:执行openssl s_client -connect example.com:443 -servername example.com -status -tlsextdebug,输出含“ocsp response: successful (0x0)”和“certstatus: good”即生效;若为“no response sent”或无ocsp字段则失败。

验证生产环境中 OCSP Stapling 是否真正生效,不能只看配置是否写上或 Nginx 是否重启成功——它极易“静默失效”:配置全对、日志无报错,但客户端收不到 stapled 响应。必须用终端命令实测响应内容、结合网络行为交叉判断。
用 openssl s_client 直接抓取并解析 OCSP 响应
这是最权威、最直接的验证方式,能明确看到 Nginx 是否在 TLS 握手时发出了有效装订数据:
- 执行命令:openssl s_client -connect example.com:443 -servername example.com -status -tlsextdebug 2>&1
- 重点检查输出中是否包含两行关键内容:
OCSP response: successful (0x0)
CertStatus: good(或 revoked / unknown) - 若出现 OCSP response: no response sent,或压根没输出任何 OCSP 字段,说明 stapling 未启用或配置失败
- 注意:-status 参数必不可少,否则客户端不发起 OCSP 状态查询请求,Nginx 也不会装订
用 curl + time 观察首字节延迟变化
OCSP Stapling 的核心价值是减少 TLS 握手耗时,尤其在弱网或跨地域访问时效果明显。通过 TTFB 中的 time_appconnect 可间接反映效果:
- 执行命令:curl -o /dev/null -s -w "time_appconnect: %{time_appconnect}\n" https://example.com --resolve "example.com:443:你的服务器IP" -H "Cache-Control: no-cache"
-
time_appconnect包含 DNS、TCP 连接和 TLS 握手全过程,其中 TLS 握手占大头 - 在相同网络出口(如固定云服务器)下,对比开启/关闭 stapling 后的数值:下降 150–300ms 属典型有效表现
- 务必用
--resolve绕过 DNS 缓存,避免 CDN 或本地 DNS 干扰结果
用 Wireshark 抓包确认实际传输内容
当 openssl 显示 “no response sent”,但你确信配置无误时,抓包能定位是服务端没发、还是客户端没要:
- 在客户端机器抓包,过滤:tls.handshake.type == 1 || tls.handshake.type == 2
- 找到 ServerHello 报文 → 展开 Extensions → status_request → CertificateStatus → OCSPResponse
- 若能看到完整的 OCSPResponse 数据体(长度非零),说明 Nginx 成功装订并发出
- 若 ServerHello 里有 status_request 扩展,但没有 OCSPResponse 字段,说明 Nginx 侧未装订(配置或信任链问题)
- 若 ClientHello 根本没带 status_request 扩展,可能是浏览器禁用、证书不支持,或客户端环境限制
查 Nginx 错误日志与 SSL Labs 辅助验证
日志虽不总报错,但几个关键词能快速暴露底层失败原因;SSL Labs 则提供第三方视角确认:
- 检查 error.log 中是否出现:
no resolver defined(缺少 resolver)
issuer certificate not found(ssl_trusted_certificate 路径错或内容缺根/中间证书)
verify failed(签名无效、时间超差、DNS 不通)
timeout(OCSP 查询超时,常因防火墙或网络策略) - 访问 SSL Labs 测试页,输入域名,查看结果页中 “OCSP stapling” 一栏是否显示 Yes
- SSL Labs 是真实模拟主流浏览器行为,其判定具有强参考性,且会提示具体失败环节(如 “No OCSP response received”)











