必须用 ssl_stapling_file 配合离线生成与原子更新,才能实现零延迟、高可用;需同时配置 ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate、resolver 四项,缺一不可。

要真正优化 Nginx 的 OCSP Stapling 本地缓存机制,关键不是依赖运行时自动拉取,而是把响应文件“提前准备好、稳稳放好、按时换新”。原生的 ssl_stapling on 只是开关,不解决首次延迟、跨进程共享、服务宕机降级等问题。必须用 ssl_stapling_file 配合离线生成与原子更新,才能实现零延迟、高可用。
必须配齐四项基础配置
缺一不可,否则客户端收不到 stapled 响应:
-
ssl_stapling on:启用装订功能(仅开关,不保证可用) -
ssl_stapling_verify on:强制校验响应签名和时间有效性,防止过期或伪造数据被误用 -
ssl_trusted_certificate /path/to/chain.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 启动时即读取 ssl_stapling_file,只要该 DER 文件有效(签名可验、状态为 good、未过期),就立即启用 stapling——完全绕开网络请求,实现真正零延迟。
- 在
server块中添加:ssl_stapling_file /var/lib/nginx/ocsp/example.com.ocsp.resp; - 目录需提前创建并授权:
sudo mkdir -p /var/lib/nginx/ocsp && sudo chown www-data:www-data /var/lib/nginx/ocsp - 响应文件必须是 DER 格式(
.resp后缀),不能是文本格式(.txt或.ocsp)
安全更新与长期有效性保障
OCSP 响应有明确有效期(Let’s Encrypt 通常 7 天),不能一劳永逸。更新必须原子、可验、带 fallback:
- 脚本每次先生成临时文件(如
example.com.ocsp.resp.new),校验通过后再mv替换原文件 - 校验逻辑至少包含两项:
openssl ocsp -verify_other验签 +grep ": good"确认状态 - 失败时保留旧文件,绝不留空窗期;脚本中检查
nextUpdate时间,避免静默失效 - 推荐用 systemd timer 或 cron 定期执行,例如每天凌晨 3 点:
0 3 * * * /usr/local/bin/update-ocsp.sh example.com
故障时自动降级不卡死
OCSP 服务不可达时,Nginx 默认静默跳过 stapling,客户端会自行查询——这反而放大延迟波动。优化后的本地文件机制天然具备容灾能力:
- 只要
ssl_stapling_file存在且有效,无论 resolver 是否通、CA 是否在线,stapling 都照常工作 - 若文件过期或损坏,Nginx 加载配置时会报错(日志可见),便于及时发现;而不会静默退化为无 stapling 状态
- 搭配
ssl_stapling_verify on,确保只使用已验证的吊销状态,不牺牲安全性换可用性











