要让Nginx在HTTPS中稳定低延迟提供OCSP Stapling,必须配置resolver、resolver_timeout、ssl_stapling_verify,并用ssl_stapling_file预载有效OCSP响应,同时确保系统时间准确、证书链完整且不含站点证书。

要让 Nginx 在 HTTPS 中真正稳定、低延迟地提供 OCSP Stapling 响应,不能只开 ssl_stapling on,必须同时配置响应器(Responder)的缓存行为和超时控制。核心是两件事:一是确保 Nginx 能可靠获取并验证 OCSP 响应,二是避免因网络或 CA 服务异常拖慢 TLS 握手。
必需的 Responder 连接与超时配置
OCSP Stapling 依赖 Nginx 主动向证书颁发机构(如 Let’s Encrypt 的 http://ocsp.int-x3.letsencrypt.org/)发起 HTTP 请求。这个过程由 resolver 控制,不是系统 DNS,且必须显式设置超时:
-
resolver 必须显式声明多个 DNS,并设缓存有效期:
resolver 8.8.8.8 1.1.1.1 223.5.5.5 valid=300s;
不读/etc/resolv.conf,多个地址提升容错性,valid=300s防止 DNS 缓存长期失效 -
resolver_timeout 必须设为 5 秒以内:
resolver_timeout 5s;
这是关键防线——若 DNS 查询卡住,超过该时限就放弃,避免 TLS 握手阻塞 -
ssl_stapling_verify 必须开启:
ssl_stapling_verify on;
否则 Nginx 可能加载签名无效、已过期或被篡改的 OCSP 响应,失去安全意义
OCSP 响应缓存机制与可靠性保障
Nginx 原生的内存缓存默认存在静默失效风险:启动时未预热、过期后异步刷新可能失败、多 worker 间不共享。要实现“有响应就发、没响应也不卡”,需分层设计:
-
基础缓存靠 ssl_stapling_file 预载:
用openssl ocsp提前生成 DER 格式响应文件(如example.com.ocsp.resp),再通过ssl_stapling_file /var/lib/nginx/ocsp/example.com.ocsp.resp;
让 Nginx 启动即加载。只要文件有效(签名可验、状态为good、未过期),就零延迟启用 stapling -
定期更新响应文件防过期:
Let’s Encrypt 的 OCSP 响应通常 7 天过期,需定时任务每天刷新:
脚本中先写入临时文件(如.new后缀),校验通过(grep ": good"+openssl ocsp -verify_other)后再原子替换原文件 -
保留原生查询作为兜底(可选):
若仍需 fallback 能力,可保留ssl_stapling on和 resolver 配置,但明确知道它仅在预载文件不可用时触发,且受resolver_timeout严格保护
证书链与时间校验不可绕过
OCSP Stapling 不是独立功能,它高度依赖前置条件是否完备:
-
服务器时间偏差必须 ≤ ±5 分钟:
OCSP 响应含严格时间戳(thisUpdate/nextUpdate),超时即被拒绝;建议部署chrony或systemd-timesyncd自动校时 -
ssl_trusted_certificate 必须指向纯中间+根证书链:
路径如/etc/letsencrypt/live/example.com/chain.pem,顺序为中间证书在前、根证书在后,**不能包含站点证书本身**;用于验证 OCSP 响应签名,和ssl_certificate的用途完全不同 -
证书链完整性需手动验证:
执行openssl verify -CAfile /path/to/chain.pem /path/to/cert.pem,输出OK才算达标


















