Nginx启用OCSP Stapling必须显式配置resolver,因其不读/etc/resolv.conf且无默认DNS缓存;需在http块顶层设置多个DNS(如8.8.8.8 1.1.1.1)、valid=300s、resolver_timeout 5s,并验证其能解析OCSP域名,否则stapling静默失效。

要让 Nginx 顺利获取 OCSP 响应、真正启用 OCSP Stapling,DNS 解析不能依赖系统默认配置——必须在 Nginx 配置中显式、可靠地设置 resolver。否则,Nginx 会因无法解析 ocsp.int-x3.letsencrypt.org 这类域名而静默关闭 stapling,且不报错、不警告。
为什么 resolver 必须显式配置
Nginx 完全不读取 /etc/resolv.conf,也不缓存 DNS 查询结果(除非你指定 valid=)。OCSP Stapling 每次需要向证书中声明的 OCSP 响应器发起 HTTPS 请求,而第一步就是 DNS 解析。若没配 resolver,日志里只会显示一句轻描淡写的 no resolver defined to resolve OCSP responder hostname,然后 stapling 就失效了。
resolver 的正确写法和关键参数
以下配置应放在 http 块顶层(不是 server 块内),确保所有 server 都能复用:
-
多个 DNS 地址提升容错性:比如
resolver 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s;。避免单点故障,尤其当某个 DNS 临时屏蔽 OCSP 域名时 -
必须带
valid=缓存时间:推荐valid=300s(5 分钟)。太短会频繁查询拖慢握手;太长则 DNS 变更后无法及时生效 -
设好超时值:加一行
resolver_timeout 5s;。避免因某次 DNS 查询卡住,导致整个 TLS 握手延迟升高 -
IPv6 支持按需开启:如果服务器只走 IPv6 网络,加上
resolver ... ipv6=on;
验证 resolver 是否真能连通 OCSP 域名
光配对还不够,得确认它能实际解析并访问 OCSP 地址:
- 手动测试:运行
dig @8.8.8.8 ocsp.int-x3.letsencrypt.org +short,看是否返回 A 记录 - 检查 Nginx 日志:重启后访问一次 HTTPS 页面,再查 error.log,确认没有
resolver timed out或no resolver defined类报错 - 最终验证 stapling 生效:用
openssl s_client -connect example.com:443 -status -servername example.com,输出中出现OCSP response:字样才算成功
常见踩坑点
这些细节错一个,OCSP Stapling 就静默掉:
- resolver 写在了某个 server 块里 → 无效,必须在 http 块顶层
- 用了内网 CA,但 resolver 指向公网 DNS → 解析不了内网 OCSP 地址,应换为内网 DNS(如 CoreDNS)
- valid 时间设成 0 或省略 → Nginx 不缓存,每次握手都重新查 DNS,性能反降
- resolver 虽然写了,但防火墙或网络策略阻止了 UDP 53 出向请求 → 实际无法通信


















