ssl_stapling_verify on不防DNS劫持,但配合显式resolver、独立ssl_trusted_certificate(中间+根证书,顺序正确)、ssl_stapling on及可达OCSP源,可确保即使DNS被污染,伪造响应因签名校验失败而被拒绝,实现“宁可中断,也不妥协”的安全兜底。

ssl_stapling_verify 本身不防 DNS 劫持,但它配合正确配置的 resolver 和可信信任链,能防止因 DNS 劫持导致的伪造 OCSP 响应被误信。
它不验证传输通道,只验证响应本身
ssl_stapling_verify on 的作用非常明确:在 Nginx 本地对已获取的 OCSP 响应做三重检查——签名是否由可信 CA(或其授权响应器)签发、证书状态(good/revoked)是否有效、ThisUpdate/NextUpdate 时间戳是否在合理窗口内。它不加密请求、不校验 OCSP 服务器的 TLS 证书、也不干预 DNS 解析过程。所以它不能“阻止”DNS 被劫持,但能确保:即使解析到了错误域名,只要返回的响应签名校验失败,Nginx 就拒绝使用,TLS 握手直接中断。
真正防范 DNS 劫持的关键配置组合
要让 ssl_stapling_verify 发挥“最后一道防线”的作用,必须配齐以下四项,缺一不可:
-
显式且可信的 resolver:必须写明至少两个高可信 DNS(如 1.1.1.1、8.8.8.8 或内网 CoreDNS),并强制设置缓存时间:
resolver 1.1.1.1 8.8.8.8 valid=300s;。避免使用系统默认 resolv.conf,也别混用不可信 DNS。 -
独立的 ssl_trusted_certificate 文件:不能复用 ssl_certificate。必须是中间 CA + 根 CA 拼接的 PEM(中间在前、根在后),专用于验签 OCSP 响应。例如:
cat intermediate.crt root.crt > /etc/nginx/ssl/ocsp-trust.pem。 - ssl_stapling on:这是前提,不开启就无响应可验证。
- OCSP 响应源真实可达:证书 AIA 扩展里的 URL 必须能通(可用 curl 或 openssl s_client 测试),且返回标准 DER 格式、HTTP 200 响应。
为什么这算“双重验证”
第一重是 DNS 层的可靠性(resolver 配置决定能否解析到真实 OCSP 地址);第二重是内容层的可信性(ssl_stapling_verify + ssl_trusted_certificate 决定解析到的内容是否真由 CA 签发)。即使 DNS 被污染、Nginx 访问了假 OCSP 服务器,只要对方无法伪造合法签名(现实中极难),验证就会失败,连接被拒——这就实现了“宁可中断,也不妥协”的安全兜底。
额外加固建议
若环境敏感(如金融内网),可进一步降低风险:
- 部署本地 OCSP 响应代理(如 nginx + ocsp-responder),把 OCSP 查询收敛到可控服务,彻底绕过公网 DNS 依赖;
- 用
resolver_timeout 3s;缩短 DNS 查询等待,避免长时间阻塞握手; - 启用
ipv6=off;(如仅用 IPv4)或ipv6=on;(如纯 IPv6 网络),避免因 AAAA 查询失败拖慢流程; - 定期用
openssl ocsp -CAfile ... -text -url ...手动验证信任链和响应有效性,不依赖 reload 后的黑盒表现。


















