ssl_stapling_verify on仅在Nginx作为TLS终结点向客户端握手时校验本地缓存的OCSP响应,不参与回源链路;其生效必须同时配置ssl_stapling on、ssl_trusted_certificate(含正确顺序的中间+根证书)、resolver(带valid参数)及可达OCSP响应源。

ssl_stapling_verify 本身不解决“缓存回源过程中的 OCSP 校验冲突”,因为它根本不在回源链路中起作用。它只在 Nginx 作为 TLS 终结点、向**客户端发起 HTTPS 握手时**,校验自己本地获取并缓存的 OCSP 响应是否真实可信。所谓“缓存回源”通常指 CDN 或反向代理(如 Nginx)向上游服务器请求内容,而 OCSP Stapling 的验证发生在 Nginx 自身与下游客户端之间,与上游无关。
明确作用边界:它不参与回源,只保护终端握手
OCSP Stapling 是一种由服务器主动提供证书吊销状态的机制,整个流程完全在 Nginx 本机完成:
- Nginx 启动或重载后,根据证书 AIA 扩展里的 OCSP URL,用自己的 resolver 主动发起 HTTP 请求获取 OCSP 响应
- 拿到响应后,用 ssl_trusted_certificate 指定的证书链验证其签名、有效期、序列号等
- 验证通过则缓存;TLS 握手时,将该有效响应通过 certificate_status 扩展一并发送给客户端
- 整个过程不涉及 upstream、proxy_pass、回源域名或后端服务——上游服务器对 OCSP Stapling 完全无感知
所谓“冲突”往往源于配置错位或依赖未就绪
实践中出现的“校验失败导致连接中断”,不是因为和回源逻辑冲突,而是以下任一环节缺失或错误:
- ssl_trusted_certificate 文件不完整:只含根证书,漏掉签发 OCSP 响应器的中间 CA;或顺序颠倒(必须中间在前、根在后)
- resolver 缺少 valid= 参数:例如写成 resolver 8.8.8.8;Nginx 无法稳定解析 OCSP 域名,查询超时即拒绝握手
- OCSP 响应器不可达:防火墙屏蔽、CA 服务变更 URL、或返回非 200/非 DER 格式响应(如 HTML 错误页)
- 系统时间偏差 >5 分钟:OCSP 响应自带 thisUpdate/nextUpdate 时间戳,Nginx 严格校验,时间不准直接拒用
正确启用的最小必要配置组合
要让 ssl_stapling_verify 发挥作用且不拖垮 HTTPS 可用性,四条指令必须共存且准确:
- ssl_stapling on; —— 启用 stapling 行为本身
- ssl_stapling_verify on; —— 开启本地签名与时间校验
- ssl_trusted_certificate /etc/nginx/ssl/full-chain-trusted.pem; —— 单独文件,含中间 CA + 根 CA(勿复用 ssl_certificate)
- resolver 1.1.1.1 8.8.8.8 valid=300s; —— 显式 DNS 解析器,带缓存策略
验证是否真正生效的实操方式
不要只看配置是否存在,重点观察运行时行为:
- 查 error log:搜索 ocsp: response verification failed 或 SSL_do_handshake() failed,有则说明校验环节已触发但失败
- 用 OpenSSL 模拟客户端:运行
openssl s_client -connect example.com:443 -status -servername example.com,观察输出中是否含 OCSP Response Status: successful (0x0) 且无 Response Verify Failure - 手动测试 OCSP 获取链路:
openssl ocsp -issuer intermediate.crt -cert example.com.crt -url http://ocsp.example-ca.com -CAfile full-chain-trusted.pem -text,返回 response is good 才算可信链可用











