SSL证书链不完整会导致什么?
SSL 证书链不完整,是 HTTPS 连接出现证书信任错误的常见原因之一。客户端访问 HTTPS 网站时,需要验证服务器证书能否建立到受信任根 CA 的完整路径;服务器没有正确发送必要中间证书时,客户端无法完成路径验证,出现 NET::ERR_CERT_AUTHORITY_INVALID、unable to get local issuer certificate 等错误。需要明确的是,"完整证书链"不等于"服务器必须把根证书也发给客户端":服务器负责发送服务器证书和必要的中间 CA 证书,受信任的根证书一般已存在于客户端操作系统、浏览器或应用的信任库中。本文解析证书链的结构与配置(Nginx 顺序要求、Apache fullchain 方式)、设备与 Java TrustStore 差异、TLS 1.3 机制,以及从公网终端检查证书链的排查方法。
浏览器报"证书不受信任",最常见的原因不是证书本身坏了,而是服务器没把中间证书发全。证书链的结构、配置顺序和排查方法,是 HTTPS 部署里值得单独理清楚的一环。证书的信任路径是怎么构建的,可以参考证书的信任路径构建。
为什么证书需要证书链
SSL/TLS 证书一般不是由根 CA 直接签发给网站的,更常见的结构是:根 CA 签发中间 CA,中间 CA 签发网站证书。这样避免根 CA 私钥直接参与大量终端证书签发,也能通过中间 CA 对不同证书业务做隔离和管理。
浏览器拿到服务器返回的证书后,按证书中的 Issuer、签名和本地信任库构建路径。路径能连到客户端信任的根 CA,验证继续;服务器没提供客户端需要的中间证书时,路径构建失败。
服务器该发哪些证书
服务器一般不该把根证书加入发送的证书链。正确的服务器证书文件是"网站服务器证书 + 中间 CA 证书",而不是"服务器证书 + 中间证书 + 根证书"——根证书客户端已经预置,重复发送反而可能造成混淆。
证书链问题的表现不完全相同:NET::ERR_CERT_AUTHORITY_INVALID、Verify return code 20(unable to get local issuer certificate)、21(unable to verify the first certificate)都可能出现,但不能仅凭错误代码断定服务器一定缺中间证书——也可能是客户端本地信任库缺 CA,或当前验证环境无法建立路径。
同一个网站出现"部分设备正常、部分设备报错"时,不一定是服务器配置问题:不同系统用不同根证书库,不同应用有自己的 TrustStore,部分 Java 应用用独立的 JKS/PKCS12,企业应用可能通过 Network Security Configuration 指定信任锚。服务器端应主动提供规范、完整的中间证书链,不要依赖客户端自己补全。Java 应用尤其容易暴露这类问题,TrustStore 缺 CA 或中间证书没返回时,报 PKIX path building failed,网站浏览器访问正常不代表所有 Java API 客户端正常。证书链错误的处理思路可以参考证书链错误的处理。
Nginx 与 Apache 的证书链配置
Nginx 官方文档要求:ssl_certificate 文件中如果包含中间证书,按"服务器证书在前、中间证书在后"的顺序排列。fullchain.pem 的内容顺序错了(中间证书在前)会导致链验证异常:
ssl_certificate /etc/nginx/ssl/example-fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.key;
Apache 2.4.8 起,SSLCertificateFile 支持在同一 PEM 文件中包含中间 CA 证书,过去单独指定证书链的 SSLCertificateChainFile 已标记为 deprecated,现代 Apache 优先用完整 PEM 文件。证书链文件的组织与配置可以参考证书链文件的配置。
TLS 1.3 的证书链机制
TLS 1.3 没有取消服务器发送证书链:服务器仍通过 Certificate 消息发送证书链,客户端继续做路径验证。TLS 1.3 的 certificate_authorities 扩展与证书选择、客户端证书认证有关,不能替代服务器发送完整证书链。升级到 TLS 1.3 不会自动修复证书链缺失问题。
怎么检查与解决
检查服务器实际发送的链:
openssl s_client -connect example.com:443 -servername example.com -showcerts
-servername 指定 SNI 域名,一个 IP 多个 HTTPS 站点时防止检查到默认虚拟主机的证书;-showcerts 显示实际发送的证书。重点看 Verify return code,0 (ok) 表示当前 OpenSSL 信任环境验证成功,20/21 再结合具体错误判断。
顺序判断:服务器发送的证书一般按"Leaf → Intermediate 1 → Intermediate 2"排列,第一张是访问域名对应的服务器证书,后面依次是签发它的中间证书。配合 openssl x509 -in cert.pem -noout -subject -issuer 查看每张的 Subject 和 Issuer,确认上下级关系。
本地文件正确但公网仍报错的场景很常见:fullchain.pem 已更新但 Nginx 没 reload 继续用旧证书,或源站是新证书、CDN 还是旧证书。检查证书链一定要看公网 TLS 终端实际返回了什么,而不是只看服务器磁盘文件,公网侧的核对可以用证书链完整性在线检测。
确认服务器缺中间证书后的处理:Nginx 把服务器证书和中间 CA 按顺序合并到 fullchain.pem,配置后 nginx -t 确认无误再 systemctl reload nginx;Apache 用 SSLCertificateFile 加载包含中间证书的完整 PEM;Java/Tomcat 使用 JKS、PKCS12 TrustStore 时,检查对应 CA 是否已被信任。
生产环境建议用自动化减少这类问题:证书签发 → 自动生成 fullchain → 自动部署 → reload → 公网 TLS 探测 → 检查证书链 → 异常告警。多服务器、CDN、WAF 和负载均衡环境,监控各 TLS 终端实际返回的证书、证书链、到期时间、SAN、Issuer 和 TLS 版本,避免"文件已更新但公网节点仍返回旧链"。
常见问题解答
SSL 证书链必须包含根证书吗?
一般不需要。服务器通常发送网站证书和必要的中间 CA 证书,客户端通过本地信任库提供受信任的根证书。
Nginx 的证书链应该怎么排列?
服务器证书放在最前面,中间 CA 证书依次放在后面。Nginx 官方文档明确要求 ssl_certificate 文件采用这一顺序。
证书链不完整一定会导致所有浏览器报错吗?
不一定。不同操作系统、浏览器和应用可能使用不同的证书路径构建和信任库,可能出现部分设备正常、部分设备报错。但服务器不应依赖客户端自动补全,应主动提供正确的中间证书链。
Apache 还需要配置 SSLCertificateChainFile 吗?
现代 Apache 2.4.8 及以后一般不需要。可以把服务器证书和中间 CA 证书合并到 SSLCertificateFile 指定的 PEM 文件中,SSLCertificateChainFile 已过时。
为什么服务器证书已更新,证书链检查仍然失败?
可能是 Web 服务没有 reload,或 CDN、WAF、负载均衡等其他 TLS 终端没有同步更新。用 OpenSSL 从公网检查实际返回的证书链。
SSL 证书链的完整性直接影响客户端能否建立可信的证书路径。服务器应发送服务器证书和必要的中间 CA 证书,不需要重复发送客户端已信任的根证书;Nginx 要求服务器证书在前、中间证书在后,现代 Apache 2.4 用 SSLCertificateFile 加载包含中间证书的完整 PEM 文件。TLS 1.3 没有改变发送证书链和验证路径的机制。生产环境应从公网实际 TLS 终端检查证书链,而不是只看服务器本地文件。



京公网安备11010502031690号
网站经营企业工商营业执照
















