nginx https证书链报错主因是未发送中间证书,须将域名证书与中间证书严格按序拼接为fullchain.pem并配置ssl_certificate指向该文件,不可含根证书,且ssl_trusted_certificate对此无效。

HTTPS 证书链报错,绝大多数不是证书没配,而是 Nginx 没把中间证书一起发给客户端。浏览器或安卓、Python requests 等严格验证的客户端会直接拒绝连接,提示 NET::ERR_CERT_AUTHORITY_INVALID 或 CERTIFICATE_VERIFY_FAILED。核心动作就一个:让 Nginx 在 TLS 握手时发送完整的证书链(域名证书 + 中间证书),顺序不能错,根证书不能包含。
确认是否真为证书链问题
先别改配置,快速验证:
- 终端执行:
openssl s_client -connect your-domain.com:443 -showcerts 2>/dev/null | grep "subject\|issuer"—— 正常应输出至少两段证书信息(你的域名证书 + 中间证书) - 用 SSL Labs 测试,重点看 “Certificate Chain” 是否标红或显示 “Incomplete”
- 安卓设备访问报错、curl 失败但 Chrome 正常,大概率就是链不完整(安卓验证更严)
正确拼接 fullchain.pem 文件
Nginx 的 ssl_certificate 必须指向一个含完整链的 PEM 文件,且顺序固定:
- 第一部分:你的域名证书(如
example.com.crt) - 第二部分:中间证书(CA 提供的
intermediate.crt或ca-bundle.crt;若有多级,按信任路径从近到远追加) - 不要包含根证书(Root CA)——它已内置在客户端,Nginx 发送反而可能干扰验证
- 执行拼接:
cat example.com.crt intermediate.crt > fullchain.pem - 验证拼接结果:
grep -c "BEGIN CERTIFICATE" fullchain.pem应返回 ≥2
修改 Nginx 配置并生效
确保配置中只使用拼接后的文件,且路径准确:
-
ssl_certificate必须指向fullchain.pem(不是单独的.crt) -
ssl_certificate_key仍用原始私钥文件(如privkey.pem),保持不变 - 删掉或注释掉旧的
ssl_certificate /xxx/your-domain.crt;行 - 重载服务:
nginx -t && systemctl reload nginx
特别注意两个常见误区
ssl_trusted_certificate 不是用来补全服务端证书链的:
- 它仅用于客户端证书验证(
ssl_verify_client on)或反向代理校验上游证书(配合proxy_ssl_trusted_certificate) - 设了它,对浏览器访问你的站点毫无帮助,也不会修复证书链报错
- OCSP stapling 场景下可选配
ssl_trusted_certificate,但非必需,且文件内容应与fullchain.pem一致











