ocsp stapling 生效需严格区分两类 pem 文件:ssl_certificate 必须为含域名证书+中间证书的完整链(如 fullchain.pem),ssl_trusted_certificate 则须为仅含中间证书+根证书(顺序中间在前、根在后)的验证链,且需通过 openssl verify 等命令验证链完整性,并显式配置 resolver 与确保系统时间同步。

OCSP Stapling 要生效,证书链不能“凑合用”,必须严格区分两类 PEM 文件:一类是给客户端看的完整链(含站点证书),另一类是给 Nginx 自己验证 OCSP 响应用的信任链(不含站点证书)。混淆这两者是最常见的配置失败原因。
ssl_certificate 必须是“完整链”:域名证书 + 所有中间证书
这个文件用于 TLS 握手时发给浏览器,必须按顺序包含:
- 你的域名证书(最上面)
- 紧接着所有中间证书(如 Let’s Encrypt 的
ISRG Root X1和Let's Encrypt Authority X3) - 不包含根证书(浏览器自有,加了反而可能出错)
常见正确路径:/etc/letsencrypt/live/example.com/fullchain.pem。它本质就是 cert.pem 和 chain.pem 合并后的结果。别直接用 cert.pem 单独配 —— 链不全,OCSP Stapling 会静默失效。
ssl_trusted_certificate 必须是“验证链”:仅含中间证书 + 根证书
这个文件只供 Nginx 内部校验 OCSP 响应签名,和客户端无关。要求:
- 不含你的域名证书(否则验证会失败)
- 中间证书在前、根证书在后(顺序不能颠倒)
- 通常可复用 Let’s Encrypt 的
chain.pem,但需确认是否含根;若不含,需手动追加根证书(如 ISRG Root X1)
例如,手动构建命令:
cat /etc/letsencrypt/live/example.com/chain.pem /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt > /etc/nginx/ssl/trusted-chain.pem
证书链完整性必须可验证
光放对文件还不够,得让系统确认这条链真能走通:
- 运行
openssl verify -CAfile /etc/nginx/ssl/trusted-chain.pem /etc/letsencrypt/live/example.com/cert.pem,输出应为OK - 再跑
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -text -noout | grep -A1 "OCSP",确保有有效OCSP - URI:行 - 最后用
openssl ocsp -url http://ocsp.int-x3.letsencrypt.org -cert cert.pem -CAfile fullchain.pem -text测试能否拿到responseStatus: successful
resolver 和时间同步是隐性前提
即使证书链全对,这两项出问题也会让 stapling 彻底不工作,且无明显报错:
-
resolver 必须显式写在 server 块里,例如
resolver 1.1.1.1 8.8.8.8 valid=300s;—— Nginx 不读系统 DNS 配置 -
系统时间误差不能超过 ±5 分钟,否则 OCSP 响应里的
thisUpdate/nextUpdate校验失败;建议用chronyc tracking或ntpq -p检查











