nginx 启用 ocsp stapling 强制验证需同时配置四条指令:ssl_stapling on、ssl_stapling_verify on、ssl_trusted_certificate(仅含中间+根证书)、resolver(显式dns),缺一不可,否则静默失效。

要让 Nginx 的 HTTPS 配置真正启用 OCSP Stapling 并强制验证(即不只是“装订”,还要校验响应有效性),关键不在开启开关,而在于证书链、DNS 解析和信任锚的完整闭环。配置本身不难,但漏掉任一环节都会导致 ssl_stapling_verify on 实际失效——看起来开了,其实没验。
必须配齐的四个核心指令
OCSP Stapling 强制验证不是单靠 ssl_stapling on 就能生效的。以下四行需同时存在,且顺序和路径不能出错:
-
ssl_stapling on;:启用服务器主动获取并缓存 OCSP 响应 -
ssl_stapling_verify on;:要求 Nginx 在发送 OCSP 响应前,先用 CA 证书验证其签名和有效期 -
ssl_trusted_certificate /path/to/fullchain.pem;:指定含根证书+中间证书的完整信任链文件(注意:不是ssl_certificate,后者只含站点证书) -
resolver 8.8.8.8 1.1.1.1 valid=300s;:提供可用 DNS 服务器,用于解析 OCSP 响应地址(如ocsp.int-x3.letsencrypt.org);valid=300s表示 DNS 缓存 5 分钟,避免频繁查询
ssl_trusted_certificate 是最容易出错的一环
这个参数常被误写成和 ssl_certificate 一样指向站点证书(如 example.com.crt)。但 OCSP 响应由 CA 签发,验证它需要的是 CA 的公钥——也就是中间证书 + 根证书组成的完整链。
正确做法是:把 Let’s Encrypt 的 fullchain.pem(或商业证书的 ca-bundle.crt)单独复制一份,路径明确写进 ssl_trusted_certificate。例如:
该文件内容应为:
— 你的域名证书(第一段 BEGIN CERTIFICATE)
— 中间证书(第二段)
— (可选)根证书(第三段,部分 CA 不要求)
验证是否真正在强制验证
光看配置不保险。可通过以下方式确认 ssl_stapling_verify 实际生效:
- 重启 Nginx 后检查错误日志:
sudo tail -f /var/log/nginx/error.log,若看到SSL_do_handshake() failed (SSL:) SSL alert: fatal error或stapling verify error,说明验证确实在运行(哪怕失败了) - 用 OpenSSL 手动测试 OCSP 响应是否被返回且有效:
openssl s_client -connect example.com:443 -status -servername example.com 2>&1 | grep -A 17 "OCSP response"
输出中出现OCSP Response Status: successful (0x0)且Response Verify Failure不出现,才算通过 - 在 SSLLabs 测试结果中,“OCSP Stapling”项显示为 Yes,且无警告提示“Stapling not verified”
配套加固建议(提升整体安全等级)
OCSP 强制验证只是 HTTPS 安全链条中的一环。要真正拉高评级(如冲 A/A+),还需同步落实:
- 禁用 TLSv1.0 和 TLSv1.1:
ssl_protocols TLSv1.2 TLSv1.3; - 启用 HSTS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 确保 HTTP 自动跳转 HTTPS(80 → 443 301),避免明文入口
- 私钥权限设为
600,证书目录禁止 world-readable











