第三方ca特殊证书链须显式拼接域名证书+中间证书为fullchain.crt,顺序为域名证书在前、中间证书在后,根证书不可加入;nginx仅需该链文件,否则浏览器提示证书不可信。

第三方 CA 颁发的特殊证书链(比如含中间证书、多级签发、交叉证书或品牌定制链)不能直接把 .crt 当成完整链使用,必须显式拼接并验证顺序,否则 Nginx 启动可能不报错但浏览器提示“证书不可信”或“NET::ERR_CERT_AUTHORITY_INVALID”。
确认证书链完整性和顺序
真实 CA 通常提供三类文件:域名证书(如 example.com.crt)、中间证书(如 intermediate.crt 或 DigiCertSHA2SecureServerCA.crt)、根证书(如 DigiCertGlobalRootG3.crt)。Nginx 只需要前两者拼成的“证书链”,根证书由客户端自带,**不需也不应放入 `ssl_certificate`**。
- 用命令检查当前证书是否含中间信息:
openssl x509 -in example.com.crt -text -noout | grep "Issuer",若显示的 Issuer 不是知名根(如 “DigiCert Global Root G3”),说明缺中间层 - 用
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout -text查看链中证书数量和顺序,确保域名证书在最前,中间证书紧随其后 - 常见错误:把根证书也追加进去 → 浏览器会尝试校验根证书签名(它本该被信任),导致握手失败
正确拼接 fullchain.crt 文件
将域名证书放在最上面,所有中间证书按签发关系从上到下追加(即“子→父→祖父”顺序),保存为 fullchain.crt:
-
✅ 正确顺序示例:
-----BEGIN CERTIFICATE-----<br>[your domain cert]<br>-----END CERTIFICATE-----<br>-----BEGIN CERTIFICATE-----<br>[intermediate CA cert]<br>-----END CERTIFICATE-----
- ❌ 错误做法:只放域名证书;或把根证书一起塞进去;或中间证书顺序颠倒(如父证书写在子证书前面)
- 可借助在线工具如 whatsmychaincert.com 输入域名自动获取标准链,或用
curl -s https://cert.sni.velox.ch/$(hostname) | openssl x509 -text辅助验证
Nginx 配置与验证要点
在 server 块中明确指定拼好的链文件,并禁用不安全协议:
-
ssl_certificate /path/to/fullchain.crt;← 必须是拼接后的链,不是单个 .crt -
ssl_certificate_key /path/to/private.key;← 对应私钥,无密码推荐 -
ssl_trusted_certificate /path/to/ca-bundle.crt;← 仅在启用 OCSP Stapling 或客户端证书校验时才需设(非必需) - 启动后执行:
openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | openssl x509 -noout -text | grep "Issuer\|Subject",确认输出中第一张证书 Subject 匹配你的域名,Issuer 指向中间 CA;第二张证书 Subject 应与第一张的 Issuer 一致
特殊情况处理:交叉证书与品牌链
部分 CA(如 Sectigo、GoDaddy)会提供“交叉签名”链以兼容老旧系统;某些金融/政务客户要求特定品牌中间证书(如“CFCA EV SSL CA”)。此时:
- 务必使用 CA 提供的配套链文件包,不要混用不同品牌或版本的中间证书
- 若需支持旧安卓或 Windows XP,可能要额外加入 Legacy Intermediate(如 “USERTrust RSA Certification Authority”)
- 用
openssl verify -untrusted intermediate.crt -CAfile root.crt domain.crt手动验证链可达性,避免上线后才发现链断裂











