SSL Checker提示“Chain Issues”说明Nginx发送的证书链存在结构性问题,须用openssl s_client验证真实输出:正常应显示至少两段subject(域名证书+中间证书),且fullchain.pem中域名证书在前、中间证书紧随、不含根证书、无空行或乱码。

SSL Checker 工具提示 “Chain Issues” 警告,说明 Nginx 当前对外发送的证书链存在结构性问题——不是证书本身无效,而是客户端在验证信任路径时卡住了。这类警告不能只信工具结果,必须结合服务器实际输出交叉验证。
先看 SSL Checker 显示了什么
打开 SSL Checker 或 decoder.link,输入域名后重点关注三处:
- Certificate Chain:是否显示为 Domain → Intermediate → (Root) 的三级结构;若只显示 Domain,或中间断开、多出 Root,就是链异常
- Chain issues:明确提示 Incomplete(缺中间证书)、Extra certs(混入根证书)、Wrong order(顺序颠倒)等,每种对应不同修复方向
- Issuer / Subject 匹配关系:第二段证书的 Issuer 是否等于第一段的 Subject;第三段的 Issuer 是否等于第二段的 Subject——不匹配即链断裂
但 SSL Checker 会“自动补全”,你得用 openssl 看真实情况
很多在线工具为提升用户体验,会主动从本地信任库下载缺失的中间证书并拼接展示,导致它显示“OK”,而你的 Nginx 实际仍只发了一张证书。所以必须在服务器上运行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | grep "subject="
观察输出中 subject= 行的数量和内容:
- 正常应有至少两行:第一行含
CN=your-domain.com(你的域名证书),第二行含CN=Let's Encrypt R3或CN=DigiCert TLS RSA SHA256 2020 CA1(中间 CA) - 如果只有一行,或第二行是
CN=ISRG Root X1,说明 Nginx 没发中间证书,或把根证书误塞进了 fullchain.pem - 如果第二行是你的域名(比如重复出现 CN=your-domain.com),说明证书文件被重复拼接或格式污染
检查 fullchain.pem 文件是否真正合规
Nginx 的 ssl_certificate 必须指向一个严格按序拼好的 PEM 文件,不是 cert.pem,也不是系统 bundle。执行:
cat /path/to/fullchain.pem | grep "BEGIN CERTIFICATE"
确认:
- 区块数量 ≥ 2;第一块
BEGIN CERTIFICATE的 Subject 必须是你自己的域名 - 第二块起必须是中间证书,且其 Issuer 要能对上上一块的 Subject(可用
openssl x509 -in cert.pem -text -noout查看) - 不能出现
CN=ISRG Root X1、CN=DigiCert Global Root CA等根证书 - 两段之间不能有空行,不能混入私钥、注释、Windows 回车符(^M)或乱码
确认配置已重载且无其他 server 块干扰
改完文件和配置后,常见失效原因不是链本身,而是 Nginx 没真正加载新内容:
- 执行
nginx -t确保语法通过,再运行nginx -s reload(不是 restart) - 用
grep -r "server_name\|ssl_certificate" /etc/nginx/conf.d/扫描所有虚拟主机,确认目标域名没有被其他 server 块覆盖(尤其注意 www 和非 www 是否分开了) - 临时注释掉其他 server 块,只留一个测试配置,排除多配置冲突


















