OCSP Stapling 在 Nginx 中必须同时满足五项前提(证书含 OCSP URI、Nginx≥1.3.7、OpenSSL≥1.0.1、系统时间偏差≤±5分钟、证书链完整)并配置四项指令(ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate、resolver),缺一不可,否则静默失效。

直接在 server 块里写 ssl_stapling on 是不够的——OCSP Stapling 会静默失效,客户端依然要自己查 OCSP,握手延迟照旧。真正生效必须四点齐备、路径准确、位置正确。
确认证书和环境是否满足前提
缺一不可,否则配置再全也白搭:
- 证书必须含
authorityInfoAccess扩展(即有可用 OCSP 地址),用命令验证:openssl x509 -in your.crt -text -noout | grep -A1 "OCSP",输出应类似OCSP - URI:http://ocsp.int-x3.letsencrypt.org - Nginx ≥ 1.3.7(生产建议 ≥ 1.11.0),OpenSSL ≥ 1.0.1(推荐 1.1.1+)
- 系统时间误差不能超过 ±5 分钟(chrony 或 ntpd 同步)
- 证书链完整:要么
ssl_certificate指向fullchain.pem(域名证书 + 中间证书),要么确保后续ssl_trusted_certificate文件内容正确
四项核心配置必须同时写在 server 块中
全部放在 443 端口的 HTTPS server 内,顺序无关,但缺一不可:
-
ssl_stapling on;—— 显式启用装订功能 -
ssl_stapling_verify on;—— 强制校验 OCSP 响应签名、有效期和颁发者,防止缓存伪造 -
ssl_trusted_certificate /path/to/full-chain-trusted.pem;—— 专用于验证 OCSP 响应的信任链文件,只含中间 CA 和根 CA(顺序:中间在前、根在后),不包含你的域名证书 -
resolver 1.1.1.1 8.8.8.8 223.5.5.5 valid=300s;—— 必须显式指定 DNS,Nginx 不读/etc/resolv.conf;多个地址提升容错;valid=300s避免频繁解析失败
强烈建议追加:resolver_timeout 5s;,防止 DNS 查询卡住整个 TLS 握手。
规避两个最易出错的陷阱
它们不会报错,但 stapling 会彻底不工作:
-
DNS 解析失败:如果
resolver配置的 DNS 无法解析 OCSP 域名(比如私有 CA 的ocsp.internal-ca.local),Nginx 日志只会显示no resolver defined to resolve OCSP responder hostname,然后自动关闭 stapling。此时需改用内网 DNS 或手动预缓存(见下条) -
信任链文件错误:若
ssl_trusted_certificate缺少中间证书、顺序颠倒、混入了域名证书或无关 CA,ssl_stapling_verify on就会失败,Nginx 日志提示certificate verify failed,stapling 被禁用
私有 CA 或内网环境的特殊处理
若 OCSP 地址是 HTTP 协议或依赖内网 DNS/hosts,Nginx 自动 stapling 几乎必然失败(OpenSSL 层限制)。此时应放弃 resolver,改用本地预缓存方式:
- 用
openssl ocsp工具定期拉取响应,保存为二进制文件(如/var/lib/nginx/ocsp/staple.ocsp) - 在配置中添加:
ssl_stapling_file /var/lib/nginx/ocsp/staple.ocsp; - 仍需保留
ssl_stapling on;和ssl_stapling_verify on;,否则该文件不被加载 - 配合 cron 定期刷新(如每 4 小时),并校验
nextUpdate时间保证有效性


















