核心是服务器在tls握手时主动发送完整证书链。需用openssl验证输出是否含两段证书,正确拼接fullchain.pem(域名证书+中间证书,禁用根证书和私钥),nginx中配置ssl_certificate指向该文件并新增ssl_trusted_certificate,最后用ssl labs交叉验证链完整性。

核心是让服务器在 TLS 握手时主动发送完整的证书链,而不是依赖浏览器自行补全。只放域名证书、漏掉中间证书,是绝大多数“不安全”警告的直接原因。
确认证书链是否真的缺失
别光看浏览器图标——用命令快速验证:
- 在服务器上运行:openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts
- 看输出里有没有至少两段 -----BEGIN CERTIFICATE----- 内容:第一段是你自己的域名证书,第二段必须是中间证书(比如 DigiCert SHA2 Secure Server CA、ISRG Root X1 等)
- 如果只有第一段,说明链确实不完整;如果有两段但第二段显示为“self signed certificate”,那可能是拼接顺序错了或用了根证书而非中间证书
正确拼接 fullchain.pem 文件
这不是简单合并,顺序和格式必须严格:
- 用文本编辑器打开你的域名证书(如 yourdomain.crt),复制全部内容(含首尾 BEGIN/END 行)
- 换行后,粘贴中间证书(CA Bundle,不是根证书)的全部内容;多个中间证书需按签发顺序从前到后排列
- 两段之间不能有空行、不能有多余空格、不能包含私钥;保存为 fullchain.pem
- 常见错误:把根证书也加进去、把私钥混进去了、用 Windows 记事本保存导致编码异常(建议用 VS Code 或 nano 编辑)
在 Nginx server 块中正确引用
宝塔或手动编辑配置文件时,关键两行要改对:
- 把原来的 ssl_certificate /xxx/yourdomain.crt 改成:ssl_certificate /www/wwwroot/yourdomain/fullchain.pem
- 新增一行:ssl_trusted_certificate /www/wwwroot/yourdomain/fullchain.pem
- 确保 ssl_certificate_key 仍指向你原来的私钥文件(.key),不要动它
- 保存后执行 nginx -t 检查语法,再 systemctl reload nginx 或在宝塔里重启
验证是否真正生效
重启后别急着开浏览器,先用两个方式交叉确认:
- 再次运行 openssl 命令,确认输出中明确出现两段证书,且第二段 Subject 中含 “Intermediate CA” 或知名 CA 名称
- 打开 https://www.ssllabs.com/ssltest/ 输入域名扫描,结果页里 “Certificate Paths” 显示绿色 ✔️,且写着 “Chain issues: None”
- 特别注意 iOS Safari 和旧版 Windows(如 Win7/2008R2)——它们不支持自动下载中间证书,如果这些设备能正常访问,基本就稳了











