nginx ocsp 零延迟缓存需四项配置齐备:ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate 指向完整信任链、resolver 显式指定 dns;必须配合 ssl_stapling_file 预载 der 响应文件,并定时更新保障有效性。

直接在 Nginx 中开启 OCSP 缓存,不能只靠 ssl_stapling on —— 它默认不预热、不主动刷新、不共享缓存,首次访问和过期后都会卡顿。真正有效的缓存方案,是把 OCSP 响应文件“提前准备好”,再让 Nginx 零延迟加载。
必须配齐的四项基础配置
缺一不可,否则客户端根本收不到 stapled 响应:
- ssl_stapling on;:启用装订功能,但仅此一项无效
- ssl_stapling_verify on;:强制校验响应签名和时间有效性,防止伪造或过期数据被误用
-
ssl_trusted_certificate /path/to/ca-bundle.pem;:必须是完整信任链(中间 CA 在前、根 CA 在后),专用于验证 OCSP 响应本身,不是
ssl_certificate -
resolver 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s;:显式指定多个 DNS,Nginx 不读系统 resolv.conf;加
resolver_timeout 5s;防止握手卡死
用本地文件实现真正零延迟缓存
原生机制依赖运行时异步拉取,存在首访延迟和被动更新窗口。最优解是离线生成响应文件,由 Nginx 直接读取:
- 用
openssl ocsp工具生成 DER 格式响应:openssl ocsp -no_nonce -respout example.com.ocsp.resp -issuer ca.cer -cert example.com.cer -url http://ocsp.int-x3.letsencrypt.org/ - 确保证书链完整(域名证书 + 中间证书)、时间准确、网络可通达 OCSP 地址
- 在 server 块中添加:
ssl_stapling_file /var/lib/nginx/ocsp/example.com.ocsp.resp; - Nginx 启动即加载该文件,只要它有效(签名可验、状态为 good、未过期),就立即启用 stapling
配合定时更新机制保障长期可用
OCSP 响应有有效期(Let’s Encrypt 通常 7 天),需定期刷新,避免静默失效:
- 写一个 shell 脚本,每天凌晨执行一次,重新拉取并校验响应
- 新响应先写入临时文件(如
.new后缀),校验通过后再原子替换原文件 - 脚本中加入
grep ": good"和openssl ocsp -verify_other双重判断,失败则保留旧文件 - 搭配 systemd timer 或 cron 使用,例如:
0 3 * * * /usr/local/bin/update-ocsp.sh example.com
共享内存缓存作为辅助补充
若仍需保留原生查询能力(如多域名共用一套配置),可启用内部缓存,但不能替代预载方案:
-
ssl_stapling_cache shared:ocsp:1m;:1MB 约存 500 条响应,worker 进程共享复用 - 注意:该缓存仍受“首次触发”和“过期被动更新”限制,仅适合低并发或过渡场景
- 不建议与
ssl_stapling_file混用——Nginx 优先使用文件方式,缓存自动降级为备用











