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

ssl_stapling_verify on 本身不是独立可用的配置,它必须和另外三项指令一起启用,缺一不可,否则 Nginx 会拒绝 TLS 握手(常见报错:502 或 handshake failed)。
你需要在 HTTPS 的 server 块中,同时写入以下四条指令:
-
ssl_stapling on; -
ssl_stapling_verify on; -
ssl_trusted_certificate /path/to/full-chain-trusted.pem; resolver 1.1.1.1 8.8.8.8 valid=300s;
这四者构成一个完整、可信的本地 OCSP 响应验证链。单独加 ssl_stapling_verify on 不仅无效,反而会让 HTTPS 连接失败。
信任链文件必须单独准备
Nginx 不从 `ssl_certificate` 自动提取根证书,也不读系统证书库。`ssl_trusted_certificate` 指向的是专用于验签的 PEM 文件,内容只能是:- 中间 CA 证书(签发你域名证书的那个)
- 紧接着是它的上级根证书
- 顺序严格:中间在前,根在后
- 不能包含你的域名证书(即不能复用
fullchain.pem或ssl_certificate路径)
推荐生成方式:
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 才算通过。
DNS 解析器要显式且带缓存策略
Nginx 不读 `/etc/resolv.conf`,必须手动指定 `resolver`,且必须带 `valid=` 参数:- 至少配两个可靠 DNS(如
1.1.1.1和8.8.8.8) -
valid=300s表示 DNS 缓存 5 分钟,缺了valid会导致解析异常 - 如服务器仅支持 IPv6,需额外加
resolver ipv6=on;
确保 OCSP 响应源真实可达
Nginx 在 reload 或首次握手时,会主动访问证书 AIA 扩展里的 OCSP 地址(可通过 `openssl x509 -in cert.pem -noout -text | grep -A1 OCSP` 查看)。常见问题包括:- 防火墙拦截出站 HTTP 请求(Let’s Encrypt 的 OCSP 是 HTTP)
- 目标服务要求特定 TLS 版本或 Host 头,Nginx 默认不满足
- 系统时间偏差超过 ±5 分钟(OCSP 响应会因时间校验失败被拒)
- OCSP 返回非 200 状态、超时、重定向或 ASN.1 格式错误
建议提前测试连通性:
curl -v https://ocsp.int-x3.letsencrypt.org # 或 openssl s_client -connect ocsp.int-x3.letsencrypt.org:443 -servername ocsp.int-x3.letsencrypt.org
检查日志定位问题
启用后若连接异常,第一线索是 Nginx 错误日志(通常在 `/var/log/nginx/error.log`),搜索关键词:-
ocsp -
stapling -
resolver -
verify handshake failed
不要急于关闭 ssl_stapling_verify,先确认信任链、DNS、OCSP 可达性三者是否全部就绪。
不复杂但容易忽略。











