ssl_stapling_verify on 必须与 ssl_stapling on、ssl_trusted_certificate、resolver 三者共存于同一 server 块才生效,且依赖证书含 ocsp uri、nginx/openssl 版本达标、系统时间准确、网络可达 ocsp 地址及完整证书链。

Nginx 配置 ssl_stapling_verify on 不是加一行就生效的独立开关,它必须和另外三项指令协同工作,且所有条件都满足,才能真正启动本地对 OCSP 响应的签名、时效与身份三重校验。
核心逻辑很简单:
Nginx 在把 OCSP 响应“装订”发给客户端前,先用你指定的信任链验证这个响应是否真实——是不是由权威 CA(或其授权响应器)签发、有没有被篡改、时间戳是否在有效窗口内。不启用 verify,Nginx 可能转发伪造或过期的响应;启用了却配错,TLS 握手会直接失败(比如返回 502 或握手超时)。
ssl_stapling_verify 必须搭配的三项配置
这四项必须全部写在同一个 server { listen 443 ssl; } 块里,缺一不可:
ssl_stapling on;
启用 OCSP 装订机制本身。没有它,Nginx 根本不会去拉取、缓存或发送 OCSP 响应。ssl_stapling_verify on;
开启强制本地校验。它让 Nginx 拒绝任何签名无效、时间越界(thisUpdate/nextUpdate超出系统时间 ±5 分钟)、或证书 ID 不匹配的响应。-
ssl_trusted_certificate /path/to/full-chain-trusted.pem;
这个文件不是你的站点证书,而是专用于验证 OCSP 响应签名的信任链:只含中间证书 + 根证书,顺序必须是中间在前、根在后。
✅ 正确示例(Let’s Encrypt):cat /etc/letsencrypt/live/example.com/chain.pem > /etc/nginx/ssl/trusted-ca.pem
❌ 错误做法:复用
ssl_certificate文件(里面含域名证书)、只放根证书、顺序颠倒。 resolver 1.1.1.1 8.8.8.8 valid=300s;
Nginx 不读/etc/resolv.conf,必须显式指定 DNS。至少两个地址提升容错,valid=300s表示 DNS 缓存 5 分钟,避免频繁解析失败导致 stapling 中断。
验证是否真正在校验 OCSP 响应
不能只看配置重载成功,要确认本地校验已实际触发:
-
终端执行:
openssl s_client -connect example.com:443 -status -servername example.com 2>&1 | grep -A 2 "OCSP response"
成功时应看到
OCSP response: successful (0x0)和CertStatus: good。 -
提前用 OpenSSL 模拟校验流程(不重启 Nginx):
openssl ocsp -issuer intermediate.crt -cert example.com.crt \ -url http://ocsp.int-x3.letsencrypt.org \ -CAfile /etc/nginx/ssl/trusted-ca.pem -text
输出中需包含
Response verify OK。 查 Nginx 错误日志(如
/var/log/nginx/error.log),搜索关键词:ocsp,verify failed,no resolver defined,timeout,stapling—— 这些是静默失效或校验中断的关键线索。
容易忽略但致命的前提条件
即使四条指令全写对,以下五项不满足,ssl_stapling_verify 依然不会工作:
-
证书必须含有效 OCSP URI:
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 分钟:
chronyc tracking | grep "System time"
-
服务器能直连 OCSP 地址(多数为 HTTP):
curl -I http://ocsp.int-x3.letsencrypt.org
注意防火墙是否放行出站 HTTP 请求。
ssl_certificate必须是域名证书 + 中间证书合并的 PEM(如 Let’s Encrypt 的fullchain.pem),否则verify会因证书链不完整而失败。
不复杂但容易忽略。











