OCSP Stapling 的 DNS 解析超时兜底策略核心是防止 resolver 查询拖垮 TLS 握手,必须显式配置 resolver_timeout 5s、多 DNS 容错(如 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s)及可选 ssl_stapling_file 文件兜底,并通过故障模拟验证生效。

OCSP Stapling 的 DNS 解析超时兜底策略,核心是防止 resolver 查询失败或延迟拖垮 TLS 握手——它不是“可选优化”,而是保障 stapling 稳定生效的关键防线。
resolver_timeout 必须显式设为 5 秒
Nginx 默认 resolver_timeout 是 30 秒,远超 TLS 握手容忍范围。一旦 OCSP 域名(如 ocsp.int-x3.letsencrypt.org)因网络抖动、DNS 服务器响应慢或防火墙拦截而卡住,整个握手会阻塞近半分钟,用户看到的是“连接超时”或“SSL 错误”。
- 必须在 http 或 server 块中写明:resolver_timeout 5s;
- 5 秒是实测平衡值:足够覆盖多数公网 DNS 的 RTT(含重试),又不会让客户端等待过久
- 不能省略,也不能设为 0 或过小(如 1s),否则频繁超时会导致 stapling 静默关闭
resolver 要配多个 DNS 并启用缓存
单点 DNS 故障是 stapling 失效的最常见原因。Nginx 不读 /etc/resolv.conf,必须显式配置且支持容错。
- 推荐组合:resolver 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s;
- valid=300s 表示 DNS 缓存 5 分钟,避免每秒重复解析;太短(如 60s)易触发风暴,太长(如 86400s)无法响应 OCSP 域名 IP 变更
- 若服务器在内网或有可信本地 DNS(如 dnsmasq、CoreDNS),优先用 resolver 127.0.0.1 valid=300s;,更安全可控
加一层本地 fallback:ssl_stapling_file(可选但实用)
当网络临时不可达、resolver 全部超时,或你希望完全规避运行时 DNS 依赖时,可用文件兜底。
- 提前用工具(如 openssl ocsp)获取一次有效 OCSP 响应,保存为二进制文件(如 /etc/nginx/ocsp/staple.der)
- 在 server 块中添加:ssl_stapling_file /etc/nginx/ocsp/staple.der;
- Nginx 启动时加载该文件,后续握手直接返回内容,不发起任何网络请求
- 需配合定时任务定期更新(例如每天凌晨调用脚本刷新),否则响应过期后将失效
验证是否真正兜住了
别只看配置有没有写,要模拟故障验证效果:
- 临时禁用所有 DNS(iptables -A OUTPUT -p udp --dport 53 -j DROP),再用 openssl s_client -connect example.com:443 -status 测试
- 成功时仍应看到 OCSP Response Status: successful (0x0),且无超时或连接拒绝提示
- 检查 Nginx error 日志:不应出现 no resolver defined 或 resolver timeout 类警告











