ocsp stapling 缓存由响应的 nextupdate 字段决定,nginx 不支持手动延长;优化核心是预加载 der 响应文件(ssl_stapling_file),配合校验脚本每日原子更新,并配置多 dns resolver 与严格时间同步。

OCSP Stapling 的缓存时间不是由 Nginx 直接配置的“超时参数”控制的,而是由 OCSP 响应本身携带的 nextUpdate 时间决定。Nginx 会严格遵循该字段,过期即停用——所以优化重点不在“延长缓存”,而在于**确保响应始终新鲜、加载零延迟、更新不中断**。
关键:用预载文件替代运行时拉取
Nginx 原生的内存缓存(默认约 10 分钟)不可靠:重启丢失、首次访问必卡、过期后被动重拉易失败。真正可控的优化方式是使用 ssl_stapling_file 预加载 DER 格式响应:
- 响应文件在 Nginx 启动时一次性读入,只要它有效(签名正确、状态为
good、未过期),就立即启用 stapling - 避免 DNS 解析、CA 网络波动、OpenSSL 异步机制带来的不确定性
- 配合定时更新脚本,可把“有效窗口”稳定维持在 OCSP 响应最大生命周期内(如 Let’s Encrypt 为 7 天)
定时更新必须校验再替换
不能简单覆盖旧文件。更新脚本需包含双重验证:
- 用
openssl ocsp -verify_other检查响应签名和颁发者可信度 - 用
grep ": good"确认证书状态为正常(非 revoked 或 unknown) - 新响应先写入临时路径(如
.new后缀),全部校验通过后再原子替换原文件 - 建议每天凌晨执行一次,例如 cron 中:
0 3 * * * /usr/local/bin/update-ocsp.sh example.com
resolver 配置影响“备用查询”的稳定性
即使用了预载文件,仍建议保留 resolver 配置——当预载文件过期或损坏时,Nginx 可 fallback 到运行时查询。此时要保障其可用性:
- 显式指定多个 DNS(如
8.8.8.8 1.1.1.1 223.5.5.5),避免单点故障 - 设
valid=300s控制 DNS 缓存时间,平衡时效与查询压力 - 加
resolver_timeout 5s,防止 OCSP 查询卡住整个 TLS 握手
系统时间与证书链是隐性前提
这两项出错会导致 OCSP 响应被直接拒绝,看似“缓存失效”,实则是校验失败:
- 所有 Nginx 节点必须用
chrony同步时间,误差严格控制在 ±5 分钟内 -
ssl_trusted_certificate必须是完整中间 CA + 根 CA 的 PEM 文件(不含域名证书),专用于验证 OCSP 响应本身 - 确认证书含
Authority Information Access扩展,且 OCSP URL 可公网访问(openssl x509 -in cert.pem -text -noout | grep -A1 OCSP)











