核心是让Nginx在TLS握手时主动发送完整证书链;需用openssl命令验证输出至少两段证书,正确拼接fullchain.pem(域名证书+中间证书,无空行),Nginx配置ssl_certificate指向该文件,再reload并用SSL Labs等工具验证链完整性。

核心是让 Nginx 在 TLS 握手时主动发全证书链,而不是指望浏览器自己补。只放域名证书、漏掉中间证书,是“不安全”警告最常见的原因。
确认证书链是否真的缺失
别信浏览器图标或缓存,用命令实测:
- 在服务器运行:openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts
- 看输出里有没有至少两段 -----BEGIN CERTIFICATE----- 内容
- 第一段应是你自己的域名证书(含 CN=your-domain.com)
- 第二段必须是中间证书(如 CN=Let's Encrypt R3 或 CN=DigiCert SHA2 Secure Server CA)
- 如果只有第一段,或第二段显示 “self signed certificate”,说明链没传全或拼错
正确拼接 fullchain.pem 文件
这不是简单合并,顺序和格式必须严格:
- 先复制你的域名证书(如 example.com.crt),含首尾 -----BEGIN/END CERTIFICATE-----
- 换行后,紧接着粘贴中间证书(CA Bundle,不是根证书;多级则按签发顺序从前到后)
- 两段之间不能有空行、不能有多余空格、不能含私钥
- 保存为 fullchain.pem,推荐用 nano 或 VS Code 编辑,避免 Windows 记事本编码异常
- 检查方式:cat fullchain.pem | grep "BEGIN CERTIFICATE" 应输出至少两行
Nginx 配置中明确指向拼好的文件
关键就这两行,其他不动:
- ssl_certificate 必须指向你刚拼好的 fullchain.pem(覆盖原来只指域名证书的路径)
- ssl_certificate_key 仍指向原来的私钥文件(.key),保持不变
- 可额外加上 ssl_trusted_certificate /path/to/fullchain.pem,用于 OCSP stapling 或增强旧客户端兼容性,但它不参与发给浏览器的证书链
- 保存后执行 nginx -t 检查语法,再 systemctl reload nginx 生效
验证是否真正修复
重启后交叉验证:
- 再次运行 openssl 命令,确认输出中明确出现两段证书,且第二段 Subject 含中间 CA 名称
- 访问 SSL Labs 扫描,结果页 “Certification Paths” 显示绿色 ✔️,“Chain issues” 为 None
- 特别留意安卓设备:清除 Chrome 的 HSTS 缓存(chrome://net-internals/#hsts),用无痕模式访问
- iOS Safari 和 Win7/2008R2 等老旧系统能正常打开,基本说明链已完整


















