Nginx OCSP Stapling 缓存文件不支持自动同步,因其为静态DER文件,仅一次性加载,集群中需外部手段保证各节点使用内容一致、时效有效的同一份响应文件。

Nginx 的 OCSP Stapling 缓存文件本身不支持自动同步,因为它是静态的 DER 文件,由你手动预生成、Nginx 直接读取,不走共享内存或网络缓存机制。在多实例集群中,必须靠外部手段保证各节点使用**内容一致、时效有效**的同一份 OCSP 响应文件。
为什么不能依赖 Nginx 自动同步
Nginx 从不“生成”或“刷新”ssl_stapling_file指向的文件;它只做一次性加载。即使所有节点配置了相同的路径和 ssl_stapling_file 指令,只要文件内容不同、过期时间不一致,就会导致部分节点握手失败(返回 verify failed 或空响应)。集群中没有内置的跨节点 OCSP 状态协调机制。
推荐的同步方式:集中生成 + 原子分发
核心思路是——只在一个可信节点(如构建机或主控节点)生成响应,再安全、原子地推送到所有 Nginx 实例:
- 用定时任务(如 cron)在中心节点定期执行
openssl ocsp命令,生成新的.resp文件,并校验有效性(检查OCSP response: successful和CertStatus: good) - 生成后立即计算 SHA256 校验和,写入配套的
.sha256文件,供下游验证完整性 - 通过
rsync --delete-after --chmod=644或scp将新文件推送到各节点的指定目录(如/var/lib/nginx/ocsp/example.com.ocsp.resp) - 务必使用原子替换:先传到临时名(如
example.com.ocsp.resp.new),再mv覆盖原文件,避免 Nginx 读到截断或不完整数据 - 推送完成后,向所有节点发送
nginx -s reload或仅重载对应 server 块(若支持nginx -s reload不中断连接)
高可用与容错建议
避免单点故障和更新窗口期失效:
- 为每个域名准备至少两个 OCSP 响应文件(如
example.com.ocsp.resp.v1和v2),轮换使用,旧版本保留至nextUpdate时间之后再清理 - 在 Nginx 配置中,可通过变量或 Lua(配合
set_by_lua_block)动态选择文件名,实现灰度切换 - 监控每台节点的文件
mtime和nextUpdate字段(可用openssl ocsp -respin解析),告警过期或未更新节点 - 若集群使用配置中心(如 Consul、etcd),可将 OCSP 响应 base64 编码后存为 KV,由轻量 agent 拉取并写入本地文件系统
不推荐的方式
这些做法容易引入风险,实践中应避开:
- 用 NFS 共享 OCSP 目录:Nginx 并发读取可能触发文件锁竞争,且 NFS 故障会直接导致 stapling 全面中断
- 各节点独立拉取 OCSP:不同节点时钟偏差、网络波动会导致响应时间不一致,部分节点可能拿到已过期或校验失败的响应
- 跳过
ssl_stapling_verify on强制启用:失去签名与有效期校验,等于放弃安全前提,违背 OCSP Stapling 设计初衷


















