必须同时配置ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate(含顺序正确的中间+根证书)和resolver(带valid缓存时间),缺一不可,否则tls握手将失败。

直接加 ssl_stapling_verify on 不会激活校验,反而会导致 TLS 握手失败。它不是独立开关,而是整条 OCSP 验证链的“强制执行器”——必须和另外三项配置协同工作,才能真正启动本地签名完整性校验。
必须同时启用的四个指令
这四条必须共存于 HTTPS 的 server 块中,缺一不可:
-
ssl_stapling on;—— 启用 OCSP 装订机制本身,没有它,Nginx 根本不会获取或缓存 OCSP 响应 -
ssl_stapling_verify on;—— 开启对响应签名、有效期、证书 ID 的强制校验,任一不通过即拒发 -
ssl_trusted_certificate /path/to/full-chain-trusted.pem;—— 指向专用于验签的信任链文件(仅含中间 CA + 根 CA,顺序:中间在前、根在后) -
resolver 8.8.8.8 1.1.1.1 valid=300s;—— 显式配置 DNS 解析器,Nginx 不读系统resolv.conf,且必须带valid参数
重点检查 ssl\_trusted\_certificate 文件
这个文件不是你的站点证书链副本,而是 OCSP 响应验签专用的“信任锚”。常见错误包括:
- 复用
ssl_certificate路径(通常含域名证书,而验签时不能含它) - 只放根证书(缺少中间 CA,导致无法匹配 OCSP 响应器身份)
- 顺序颠倒(根证书在前、中间在后,签名验证会失败)
推荐生成方式:cat intermediate.crt root.crt > /etc/nginx/ssl/full-chain-trusted.pem
验证命令:openssl ocsp -issuer intermediate.crt -cert example.com.crt -url http://ocsp.int-x3.letsencrypt.org -CAfile /etc/nginx/ssl/full-chain-trusted.pem -text,输出含 Response verify OK 才算通过。
确保 OCSP 响应源可达且响应合规
Nginx 在 reload 或首次握手时会主动访问证书 AIA 扩展里的 OCSP URL。若该请求失败,ssl_stapling_verify on 就会直接中断握手:
- 用
openssl s_client -connect ocsp.int-x3.letsencrypt.org:80 -servername ocsp.int-x3.letsencrypt.org测试连通性(Let’s Encrypt 的 OCSP 是 HTTP,注意端口) - 确认防火墙允许出站 HTTP/HTTPS 请求(部分 CA 使用 HTTPS OCSP 端点)
- 响应必须是标准 ASN.1 OCSP Response,状态为
successful,且Cert Status为good
验证是否真正生效
不要只看配置是否写上,要实测本地校验是否触发:
- 重启 Nginx 后,用
openssl s_client -connect yourdomain.com:443 -status -servername yourdomain.com - 查看返回中是否有 OCSP Response Status: successful 和 Cert Status: good
- 同时检查 Nginx error log,搜索
ocsp、verify、no issuer cert等关键词,快速定位缺失环节











