ocsp stapling 响应签名校验失败主因是nginx无法获取ocsp响应的签发者证书(通常为中间ca),需显式配置ssl_trusted_certificate指向该中间证书,并确保时间同步、响应未过期,否则校验静默失败。

OCSP Stapling 响应签名校验失败(OCSP response signature invalid)通常不是 Nginx 自身签名出错,而是它收到的 OCSP 响应本身无法被信任——最常见原因是响应中缺失或不匹配颁发者证书(即 OCSP 签发者的证书),导致 Nginx 无法验证签名有效性。
确认 OCSP 响应是否携带完整证书链
Nginx 在验证 OCSP 响应签名时,**必须能获取到签发该 OCSP 响应的 CA 证书**(通常是中间 CA,而非根 CA)。这个证书需通过 OCSP 响应中的 certs 字段提供,或由管理员显式配置为可信锚点。若响应里没带、Nginx 又没配对的 issuer cert,就会报 signature invalid。
- 用 OpenSSL 手动抓取并解析 OCSP 响应,检查是否含 issuer cert:
openssl ocsp -issuer issuer.crt -cert example.com.crt -url http://ocsp.example.com -respout ocsp.deropenssl ocsp -respin ocsp.der -text
观察输出中是否有Response Signer Certificate或Certificates in response区块。 - 若无证书,说明上游 OCSP Responder(如 Let's Encrypt 的 OCSP 服务)未内嵌签发者证书 —— 这是合规但“不友好”的行为,Nginx 默认无法处理。
手动指定 OCSP 签发者证书(关键修复步骤)
Nginx 不会自动从证书链中提取 OCSP 签发者证书,需显式告诉它用哪个证书来验签。这个证书就是你域名证书的**直接签发者(Intermediate CA)**,通常和你的站点证书一起由 CA 提供(如 letsencrypt-intermediate.pem)。
- 把中间证书(不含根证书)单独保存为一个文件,例如
/etc/nginx/ssl/intermediate-ocsp.crt; - 在 Nginx 的
server或http块中添加:ssl_trusted_certificate /etc/nginx/ssl/intermediate-ocsp.crt;
注意:不能用ssl_certificate(那是给客户端看的),必须用ssl_trusted_certificate且只放 issuer cert; - 确保该文件权限合理(Nginx worker 进程可读),且格式为 PEM,无多余空行或注释。
检查 OCSP 响应有效期与时间同步
即使签名本身有效,若响应已过期(nextUpdate 已过)或 Nginx 服务器时间偏差过大(±5 分钟以上),OpenSSL 验证层也可能拒绝响应,并模糊报成 “signature invalid”。
- 用
openssl ocsp -respin ocsp.der -text查看Produced At和Next Update时间; - 运行
date -R确认系统时间准确,建议启用systemd-timesyncd或chrony同步; - 注意:Nginx 缓存 OCSP 响应默认 4 小时(
ssl_stapling_valid),缓存过期后会重新请求,此时若时间不准或网络异常,可能拿到无效响应。
验证配置并观察错误日志
改完配置后,务必重载 Nginx 并紧盯错误日志,因为 OCSP 验证失败往往静默降级(stapling 关闭),不报错就难察觉。
- 执行
nginx -t && nginx -s reload; - 主动触发一次 TLS 握手(如
openssl s_client -connect example.com:443 -status),观察返回中是否有OCSP Response Status: successful; - 检查 Nginx error log(如
/var/log/nginx/error.log),搜索ocsp、stapling、signature,真实错误常包含更具体线索,比如:SSL_do_handshake() failed (SSL: error:27069065:OCSP routines:OCSP_basic_verify:certificate verify error)











