浏览器“不安全”警告主因是nginx未发送中间证书,解决关键是ssl_certificate文件需按序包含域名证书和中间证书(非根证书),且无空行、无私钥;通过openssl命令验证输出至少两段begin certificate,ssl labs显示chain issues为none即生效。

浏览器出现“不安全”红字警告,绝大多数情况不是证书没装,而是 Nginx 没把中间证书(Intermediate CA)发给客户端——信任链断在半路。解决的关键,是让 ssl_certificate 文件本身包含完整、顺序正确的证书链,而非依赖浏览器自动补全。
确认中间证书是否真的缺失
别只看浏览器锁图标,用命令实测最准:
- 在服务器执行:openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts 2>/dev/null | grep "BEGIN CERTIFICATE"
- 输出应至少显示两段 -----BEGIN CERTIFICATE-----:第一段是你自己的域名证书,第二段必须是中间证书(如 Let's Encrypt R3、DigiCert SHA2 Secure Server CA 等)
- 如果只有一段,或第二段显示 self signed certificate,说明链缺失或拼接错误
正确合并 fullchain.pem 文件
这不是简单复制粘贴,顺序和格式决定成败:
- 先打开你的域名证书(如
yourdomain.crt),完整复制含首尾 BEGIN/END 行的内容 - 换行后,粘贴中间证书(CA Bundle,不是根证书;多个中间证书需按签发顺序从前到后排列)
- 两段之间不能有空行、不能有多余空格、不能含私钥
- 保存为
fullchain.pem,推荐用 VS Code 或nano编辑,避免 Windows 记事本编码异常
Nginx 配置中真正起作用的只有这一行
ssl_certificate 是唯一向浏览器发送证书链的指令,必须指向拼接好的文件:
- 把原配置中的
ssl_certificate /xxx/yourdomain.crt改为:
ssl_certificate /www/wwwroot/yourdomain/fullchain.pem; - 保留原有
ssl_certificate_key指向私钥文件(.key),不要动它 -
ssl_trusted_certificate仅用于 Nginx 内部(如 OCSP stapling 或 mTLS),对浏览器无效,可配可不配,但不能替代ssl_certificate
验证修复是否真正生效
重启 Nginx 后,交叉验证更可靠:
- 再次运行 openssl 命令,确认输出中明确出现两段证书,且第二段 Subject 包含知名中间 CA 名称
- 访问 SSL Labs 扫描,关注 “Certification Paths” 是否显示绿色 ✔️,且 “Chain issues” 标注为 None
- 特别测试 iOS Safari 和安卓 Chrome —— 它们不缓存中间证书,若这些设备正常,基本说明链已传全











