绝大多数“不安全”提示源于Nginx未发送中间证书,导致客户端无法构建完整信任链;需将域名证书与中间证书按顺序拼接为fullchain.pem并配置ssl_certificate指向该文件。

浏览器提示“不安全”或“NET::ERR_CERT_AUTHORITY_INVALID”,绝大多数情况不是证书没装,而是中间证书没发出去——Nginx 没把中间证书包含在 TLS 握手响应里,客户端无法拼出完整信任链。
为什么中间证书缺失会导致报错
HTTPS 信任链必须从你的域名证书逐级向上验证到系统预置的根证书。中间证书是承上启下的关键一环:它由根 CA 签发,又用来签发你的域名证书。如果 Nginx 只发送了域名证书,客户端(尤其是安卓、微信 WebView、旧版 Chrome)就找不到上级签发者,直接判定不可信。
iOS 和部分桌面浏览器自带缓存或宽松校验,可能“碰巧”通过;但安卓 7.0+、小程序 WebView、企业内网设备等验证更严格,缺一级就中断。
真正起作用的配置项只有 ssl_certificate
Nginx 向浏览器发送证书链,只依赖 ssl_certificate 指向的文件内容。这个文件必须是 PEM 格式拼接体,顺序严格为:
- 你的域名证书(如
example.com.crt) - 紧接着所有中间证书(如
intermediate.crt,多级则按信任路径从近到远追加) - 不能包含根证书(浏览器/系统已内置,加了反而可能触发兼容问题)
- 两段之间不能有空行,每段以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾
常见错误是误以为 ssl_trusted_certificate 能补救——它只供 Nginx 自身用(比如验证 OCSP 响应或客户端证书),完全不参与发给浏览器的证书链。
如何确认并修复证书链
别信宝塔界面图标或浏览器缓存,用命令实测:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject="
正常输出应至少含两行:
-
subject=CN = your-domain.com(你的域名证书) -
subject=CN = Let's Encrypt R3或subject=CN = GlobalSign RSA OV SSL CA 2022(中间 CA 名称)
若只看到一行,说明链不完整。修复步骤:
- 用
cat example.com.crt intermediate.crt > /etc/nginx/ssl/fullchain.pem合并证书 - 在 Nginx 配置中明确指向该文件:
ssl_certificate /etc/nginx/ssl/fullchain.pem; - 私钥单独配置:
ssl_certificate_key /etc/nginx/ssl/example.com.key; - 执行
nginx -t && nginx -s reload重载
特殊场景注意事项
宝塔用户注意:“自动补全证书链”按钮对 Let’s Encrypt 通常有效,但对 ZeroSSL、BuyPass、自签名或私有 CA 签发的证书大概率失效,甚至可能清空内容。务必手动检查:
- 进入【网站】→【SSL】→【证书信息】,看是否显示“证书链完整”且无红色感叹号
- 直接运行
cat /etc/nginx/ssl/fullchain.pem,确认文件内含两个及以上BEGIN CERTIFICATE段
使用在线工具(如 SSL Labs 或 myssl.cn)二次验证,重点关注 “Certificate Chain” 是否标为 OK。


















