nginx ocsp stapling 失败默认静默,不报错不警告;需通过检查error.log关键词(如no resolver defined)、启用ssl_stapling_verify on配合openssl测试、自定义日志观察握手延迟、手动运行openssl ocsp命令巡检等四类操作间接定位问题。

Nginx 默认不会为 OCSP Stapling 失败生成明确、可读的日志条目——这是它最易被忽视的特性:失败时大多静默关闭 stapling,不报错、不警告、也不 fallback。所以“记录失败日志”不是打开某个开关就能实现的事,而是要通过组合配置 + 主动验证 + 日志关键词捕获来间接暴露问题。
以下四类实际可落地的操作,能帮你定位并“记录”OCSP 状态获取失败的线索:
确保 error.log 中能捕获关键错误信号
Nginx 只在少数明确失败路径下写入 error.log,需确认以下几类关键词是否出现(重启 Nginx 后立即检查):no resolver defined→ 缺少resolver指令或未生效issuer certificate not found→ssl_trusted_certificate文件路径错误、为空、或内容缺失中间/根证书connect() failed (111: Connection refused)或connection timed out→ 出站连接被防火墙拦截,或 OCSP 域名不可达verify failed→ OCSP 响应签名无效、时间戳超差(系统时间不准)、或证书链顺序错误启用
ssl_stapling_verify on并依赖其副作用
这个指令本身不打新日志,但它会让 Nginx 在验证失败时直接跳过 stapling。虽然无显式提示,但配合openssl s_client -status测试可发现“no response sent”,反向说明验证环节已中断。这是判断 stapling 是否真正工作的黄金标准。-
用自定义日志格式暴露握手异常迹象
虽然不能直接记录 OCSP 获取过程,但可通过 TLS 握手结果间接反映问题:
在http块中添加:log_format ocsp_debug '$remote_addr - [$time_local] ' '"$request" $status $ssl_protocol "$ssl_cipher" ' '$ssl_session_reused $request_time $upstream_connect_time';若大量请求显示
$ssl_session_reused 0且$request_time > 300ms,尤其在高并发下稳定复现,大概率是 OCSP 查询阻塞(DNS 解析慢、超时重试、或反复失败后降级)。 -
手动触发并记录 OCSP 获取状态(推荐用于巡检)
写一个简单脚本定期执行并追加到独立日志:echo "[$(date)] Testing OCSP for example.com:" >> /var/log/nginx/ocsp-test.log timeout 10 openssl ocsp -issuer intermediate.crt -cert example.com.crt \ -url http://ocsp.int-x3.letsencrypt.org \ -CAfile /etc/nginx/ssl/trusted-ocsp-ca.pem -text 2>&1 >> /var/log/nginx/ocsp-test.log echo "---" >> /var/log/nginx/ocsp-test.log
这样能捕获
Response verify OK、unable to get local issuer certificate、timed out等真实响应细节,比依赖 Nginx 自身日志更可靠。
不复杂但容易忽略:Nginx 的 OCSP 日志本质是“缺失型日志”——你不是在找它写了什么,而是在找它为什么没写、以及哪些外部信号暴露了它的沉默。











