Nginx需将域名证书与中间证书按顺序拼入同一PEM文件供ssl_certificate指向,不可依赖ssl_trusted_certificate补全;验证须用openssl s_client检查输出是否含至少两段证书,安卓用户需清HSTS缓存。

Nginx 本身不会自动补全缺失的中间证书,它只按配置中 ssl_certificate 指向的文件内容,原样发送给客户端。如果该文件里只有你的域名证书、没包含中间证书,Nginx 就只发这一张证书——浏览器或安卓设备无法构建信任链,就会报“不安全”“证书链不完整”或“NET::ERR_CERT_AUTHORITY_INVALID”。
核心原则:证书链必须拼在 ssl_certificate 文件里
不是靠其他指令“补”,而是让 ssl_certificate 指向一个已拼好的 PEM 文件,顺序严格为:
- 第一段:你的域名证书(如
example.com.crt) - 紧接着:中间证书(如
intermediate.crt;多级则按信任路径从近到远追加) - 不能含根证书(浏览器自带,加了反而可能出兼容问题)
- 两段之间无空行,每段以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾
常见错误配置:误用 ssl_trusted_certificate
ssl_trusted_certificate 不参与服务端证书下发,它只用于 Nginx 自身用途:
- 验证 OCSP stapling 响应签名(配合
ssl_stapling_verify on) - 校验客户端证书(启用
ssl_verify_client on时) - 它不会发给浏览器,改它对修复“链不完整”完全无效
验证是否真正修复
别信浏览器图标或缓存,用命令实测:
- 执行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject=" - 输出中应至少看到两行:
• 一行含CN=your-domain.com
• 一行含中间 CA 名称(如CN=Let's Encrypt R3或CN=DigiCert SHA2 Secure Server CA) - 安卓用户建议清 HSTS 缓存(
chrome://net-internals/#hsts),再用无痕模式访问
宝塔等面板用户的特别提醒
面板的“自动补全证书链”功能对 Let’s Encrypt 通常有效,但对 ZeroSSL、BuyPass、私有 CA 或自签名证书大概率失效,甚至可能清空原有证书。务必手动检查:
- 进入【网站】→【SSL】→【证书信息】,确认显示“证书链完整”且无红色感叹号
- 直接运行
cat /www/wwwroot/yourdomain/fullchain.pem,看是否确实含两个以上BEGIN CERTIFICATE区块 - 配置中
ssl_certificate路径必须指向这个拼好的文件,不是原始的.crt


















