OCSP Stapling 并非仅开启 ssl_stapling on 即可生效,而需满足 Nginx≥1.3.7、服务器可访问 OCSP URL、证书链完整、系统时间准确等前提,并配置 ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate 和 resolver 四项缺一不可。

直接开启 ssl_stapling on 不等于 OCSP Stapling 就跑起来了。它是一套需要服务端主动获取、签名验证、缓存分发的协同机制,配置缺一环,客户端就收不到 stapled 响应,依然得自己连 CA 查吊销状态。
确保基础条件全部到位
OCSP Stapling 不是“开了就灵”的开关,它依赖几个硬性前提:
- Nginx 版本不低于 1.3.7,生产环境建议用 1.11.0 或更高——旧版本对 OCSP 错误响应处理不稳,容易静默失败;
- 服务器必须能直连证书中 AIA 扩展里写的 OCSP URL(比如
http://ocsp.int-x3.letsencrypt.org),可用openssl ocsp -url [URL] -cert your.crt -CAfile chain.pem -text手动测试是否返回responseStatus: successful; - SSL 证书链要完整:
ssl_certificate必须是 域名证书 + 中间证书 合并的 PEM 文件(Let’s Encrypt 的fullchain.pem就是标准格式); - 系统时间误差不能超过 5 分钟,否则 OCSP 响应里的有效期校验会直接被 Nginx 拒绝。
核心配置项一个都不能少
只写 ssl_stapling on 和 ssl_stapling_verify on 是常见误区。以下四条必须同时存在且路径/参数正确:
-
ssl_stapling on;—— 启用功能,让 Nginx 主动发起 OCSP 请求; -
ssl_stapling_verify on;—— 强制校验 OCSP 响应的签名和时间有效性,防止缓存污染或中间人伪造; -
ssl_trusted_certificate /path/to/full-chain-trusted.pem;—— 这个文件不是ssl_certificate,而是专门用于验证 OCSP 响应签名的“信任链”,需包含 签发 OCSP 响应器的中间 CA + 根 CA(顺序:中间在前,根在后); -
resolver 8.8.8.8 1.1.1.1 valid=300s;—— 显式指定 DNS 解析器,Nginx 不读系统/etc/resolv.conf;valid=300s避免 DNS 缓存过期导致后续 stapling 失败。
可选但推荐:resolver_timeout 5s; 防止 DNS 查询卡住 TLS 握手;ssl_stapling_responder 可覆盖证书自带的 OCSP 地址,适用于自定义 CA 或调试场景。
验证是否真正生效
别只信配置文件保存了,要用真实握手抓包验证:
- 终端执行:
openssl s_client -connect yourdomain.com:443 -status -tls1_2; - 观察输出中是否有
OCSP response:字样,且后面紧跟着responseStatus: successful (0x0); - 若出现
OCSP Response Status: no response sent或压根没这一段,说明 stapling 未触发,需回头检查 resolver 是否生效、ssl_trusted_certificate是否缺失中间 CA、或 OCSP URL 是否被防火墙拦截; - 浏览器开发者工具的 Security 标签页也能看到连接是否携带了 OCSP 响应(Chrome/Firefox 支持显示)。
常见故障点与快速排查
很多问题其实出在细节上,而不是逻辑本身:
-
误用证书文件:把
ssl_certificate指向的fullchain.pem直接当ssl_trusted_certificate用——它通常不含根证书,而 OCSP 签名验证需要完整信任链; -
DNS 解析失败:Nginx 启动时若 resolver 不通,会静默跳过 stapling;用
nginx -t无法发现,必须看error.log里有没有could not be resolved类报错; - OCSP 响应器要求 HTTP/1.1 或特定 Host 头:某些 CA(如旧版 WoSign)的 OCSP 服务不兼容 HTTP/1.0,Nginx 默认可能发错协议,此时需加 upstream 代理或换用支持更广的 CA;
-
reload 后未刷新缓存:修改配置后
systemctl reload nginx,但旧的 OCSP 响应仍缓存着,可临时加ssl_stapling off;再开一次强制刷新。











