ssl_stapling_verify on的作用是让Nginx用ssl_trusted_certificate指定的证书链本地验证OCSP响应的签名、有效期及签发者可信性,不保障传输安全;必须与ssl_stapling on、ssl_trusted_certificate(含正确顺序的中间+根证书)、resolver(带valid参数)四者共存才生效。

ssl_stapling_verify on 不验证传输过程,只验证响应内容本身是否可信——它验的是签名、有效期和签发者,不是 HTTPS 链路或 DNS 是否被劫持。
ssl_stapling_verify on 的真实作用
这个指令让 Nginx 在本地用 ssl_trusted_certificate 中的证书去校验已获取的 OCSP 响应:签名是否由可信 CA 签发、响应是否在有效期内、证书序列号是否匹配。它不加密请求、不强制 OCSP URL 必须走 HTTPS、也不检查 TLS 握手层是否被中间人篡改。
换句话说:传输安全靠 resolver、防火墙、网络策略保障;内容可信靠 ssl_stapling_verify + ssl_trusted_certificate 保障。
- 若 OCSP 响应是 HTTP 返回的(如 Let’s Encrypt),Nginx 不会拒绝——只要签名能验过
- 若响应里时间戳过期、签名验不过、或 issuer 证书不在
ssl_trusted_certificate中,Nginx 直接拒用该响应,可能触发 502 或 handshake failed - 它不替代客户端验证,而是提前把伪造/过期响应拦在服务端
ssl_trusted_certificate 文件必须含中间 + 根证书,且顺序不能错
Nginx 完全不读系统信任库,也不从 ssl_certificate 自动提取根或中间证书。它只认你显式指定的 PEM 文件,且该文件必须按顺序包含:
- 签发你域名证书的中间 CA 证书(例如 Let’s Encrypt 的 R3)
- 该中间 CA 的上级根证书(例如 ISRG Root X1)
顺序错误(比如根在前、中间在后)或漏掉中间层,都会导致 verify error: unable to get issuer certificate 类日志,验证失败。
推荐合并方式:cat intermediate.crt root.crt > full-chain-trusted.pem
验证是否有效:openssl ocsp -issuer intermediate.crt -cert example.com.crt -url http://ocsp.int-x3.letsencrypt.org -CAfile full-chain-trusted.pem -text,输出含 Response verify OK 才算通过。
resolver 和 OCSP 可达性是硬依赖,不是可选项
ssl_stapling_verify on 启用后,Nginx 在 reload 或首次握手时就会主动访问证书 AIA 扩展里的 OCSP URL。如果以下任一条件不满足,TLS 握手直接中断:
-
resolver未配置,或配置了但没加valid=300s(Nginx 不读/etc/resolv.conf,且无valid会导致 DNS 缓存异常) - OCSP 域名无法解析(如 DNS 污染、
resolver不可达) - OCSP URL 返回非 200 响应、超时、或返回格式非法(如非 DER 编码)
建议加 resolver_timeout 5s; 防止 DNS 卡住整个握手流程;用 curl -v https://ocsp.int-x3.letsencrypt.org 提前确认连通性与 TLS 兼容性(某些 CA 对 SNI 或 TLS 版本有隐式要求)。
四项配置缺一不可,否则 ssl_stapling_verify 形同虚设
单独写 ssl_stapling_verify on; 不仅无效,反而会让服务更脆弱——它把所有 stapling 环节变成强依赖,但自身不触发任何 OCSP 行为。以下四条必须同时存在且正确:
-
ssl_stapling on;—— 启用 stapling 机制本身 -
ssl_stapling_verify on;—— 开启响应签名与有效期校验 -
ssl_trusted_certificate /path/to/full-chain-trusted.pem;—— 提供完整信任链(中间+根,顺序固定) -
resolver 1.1.1.1 8.8.8.8 valid=300s;—— 显式配置 DNS 解析器并带缓存策略
最容易被忽略的是:ssl_trusted_certificate 文件路径是否真实存在、权限是否可读、证书是否真的覆盖了 OCSP 响应器的 issuer;以及 resolver 是否真的能解析出 OCSP 域名——这两点出问题,Nginx 日志里往往只报模糊的 OCSP response error,而不是明确指出哪一环断了。


















