确认证书链不完整需通过浏览器“证书路径”查看是否仅有一层证书,或用openssl命令检查Issuer与Subject能否逐级串联;合并PEM文件时须严格遵循域名证书在前、中间证书在后、无私钥、无多余空行的格式。

怎么确认证书链确实不完整?
别信宝塔后台那个“已启用HTTPS”的绿色提示,它根本不校验链。打开 Chrome 访问你的域名,点地址栏锁图标 → “连接是安全的” → “证书有效” → 切到“证书路径”页签。如果只显示一层(只有你的域名证书),没中间证书,就是链断了。更准的方法是终端执行:openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -text | grep "Issuer\|Subject",看 Issuer 和下一级 Subject 是否能串起来。
合并证书文件时顺序和空行必须严格正确
PEM 文件不是随便拼一起就行,Nginx 只认特定结构:
- 第一段必须是你的域名证书,以
-----BEGIN CERTIFICATE-----开头 - 紧接着**换行 + 一个空行**(不能是两个空行,也不能没有)
- 第二段必须是中间证书(CA Bundle),同样以
-----BEGIN CERTIFICATE-----开头 - 根证书不用手动加——它已内置在客户端,加了反而可能被 Nginx 忽略或报错
- 整个文件里**不能出现私钥**,私钥要单独填进宝塔的“密钥(KEY)”框
常见错误:把 ca-bundle.crt 粘在最前面,或者两段之间多了一个回车,又或者用 Windows 记事本保存导致换行符变成 \r\n —— 这些都会让 Nginx 加载失败,但宝塔界面不报错,只默默用旧配置。
从哪找正确的中间证书?
别猜、别复制别人家的,直接按来源拿:
- Let’s Encrypt:用
acme.sh申请时,默认生成的fullchain.cer就是正确拼好的,路径类似~/.acme.sh/your.domain/fullchain.cer;cert.cer是纯域名证书,不能用 - DigiCert / Sectigo:登录其后台,在证书下载页选 “Nginx” 或 “Other” 格式,会提供一个含中间证书的 ZIP 包,里面通常叫
ca_bundle.crt或DigiCertCA.crt - 腾讯云 / 阿里云 SSL 控制台:下载证书时勾选“包含中间证书”,得到的
certificate.pem才可用;单下载的domain.crt一定缺链
拿到后,用 cat domain.crt ca_bundle.crt > fullchain.pem 合并比手工复制更可靠,避免隐藏字符混入。
粘贴进宝塔后为什么还是不生效?
保存按钮点了≠配置落地。必须做三件事:
- 确认你粘的是完整
fullchain.pem内容,不是cert.pem,也不是带私钥的 PFX 文件解出来的内容 - 检查“私钥(KEY)”框里填的是纯私钥(开头是
-----BEGIN PRIVATE KEY-----),且权限是600:chmod 600 /www/wwwroot/yourdomain/privkey.pem - 点击【保存】后,**必须点右上角“重启 Nginx”** —— 宝塔不会自动重载,改完证书不重启等于没改
最后验证:用 curl -I https://yourdomain.com 看响应头有没有 Strict-Transport-Security;再跑一次 SSL Labs 测试,Certification Paths 显示三条且全绿才算真正搞定。移动端尤其容易在这里翻车,因为它们基本不自动补链。


















