nginx证书链不完整导致客户端报错,根源是ssl_certificate未包含域名证书+中间证书,需用openssl s_client验证输出至少两段subject(含cn=域名和cn=中间ca),且fullchain.pem中域名证书在前、中间证书紧随、无根证书、无空行。

这个提示不是 Nginx 自身加载失败的报错,而是客户端(比如浏览器、curl、Python requests)在连接你的 Nginx 服务时,验证证书链过程中失败所返回的错误。Nginx 本身不会“提示”这个信息——它只是没把完整的证书链发给客户端,导致客户端找不到中间 CA 来向上追溯到系统信任的根证书。
看日志确认问题源头
先查 Nginx 错误日志(如 /var/log/nginx/error.log),如果里面没出现该错误,说明问题出在客户端验签环节,而非 Nginx 启动或配置加载阶段。真正要关注的是:
– 客户端报错是否含 unable to get local issuer certificate 或 verify return code: 20
– 浏览器地址栏是否显示“不安全”或锁图标带警告
– 是否仅部分客户端(如旧版 curl、Java 应用、某些 API 工具)报错,而 Chrome/Firefox 正常
用 openssl 直接验证证书链下发情况
执行以下命令,观察 Nginx 实际发送了哪些证书:
- echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts 2>/dev/null
输出中应至少看到两段 BEGIN CERTIFICATE:第一段是你的域名证书,第二段(及后续)必须是中间证书。若只有一段,说明 Nginx 配置的 ssl_certificate 文件缺失中间证书。
检查 Nginx 证书文件内容与配置
确认你配置中使用的证书文件是否为 fullchain.pem(不是 cert.pem):
- 运行 openssl crl2pkcs7 -nocrl -certfile /path/to/your/cert.pem | openssl pkcs7 -print_certs -noout,对比输出和 fullchain.pem 是否一致
- 确保
ssl_certificate指向的是“域名证书 + 所有中间证书”的拼接文件,且顺序正确:域名证书在最前,中间证书依次追加,不包含根证书 -
ssl_certificate_key仍指向私钥,无需改动
验证配置是否生效
改完配置后重载 Nginx,并再次用 openssl 测试。还可借助第三方工具交叉验证:
- 访问 SSL Labs Server Test,查看 “Certification Paths” 是否显示完整链路
- 若报告提示 “Chain issues: Incomplete” 或 “Extra download”,就坐实了证书链缺失











