是,证书链中混入已过期的交叉根证书会导致Java、Python requests等客户端TLS验证失败。因这些客户端严格校验链中每张证书有效期,而浏览器可能忽略过期交叉根并自动补全有效路径,造成现象不一致。

证书链中混入已过期的交叉根证书,会导致部分客户端(尤其是 Java、Python requests、旧版 Android)在验证时失败,报 CERTIFICATE_VERIFY_FAILED 或 “unable to get local issuer certificate” 等错误。这类问题隐蔽性强——浏览器可能显示“安全”,但程序调用却失败;SSL Labs 测试页也可能标绿,却在“Chain Issues”里提示 “Contains expired certificate”。关键不是证书本身过期,而是链里不该出现的、已过期的交叉根(如 Let’s Encrypt 的 ISRG Root X1 交叉签名版,或 DigiCert 的过期交叉 CA)被错误拼进 fullchain.pem。
确认是否真混入了过期交叉根证书
别看文件名或目录结构,直接解析证书内容:
- 运行:
openssl x509 -in /path/to/fullchain.pem -noout -serial -dates -issuer -subject - 观察每段证书的
notAfter和issuer字段:若某段证书的notAfter早于当前时间(2026年9月15日),且其issuer不是主流可信根(如O=Digital Signature Trust Co., CN=DST Root CA X3),而是类似CN=ISRG Root X1 (cross-signed)或CN=USERTrust RSA Certification Authority (cross),基本可判定为过期交叉根 - 特别注意:Let’s Encrypt 的
ISRG Root X1原生根证书(非交叉)有效期至 2035 年,但其 2015–2024 年间发布的交叉签名版(用于兼容老系统)已于 2024 年 9 月 30 日过期,极易被误留
检查 fullchain.pem 是否误拼了交叉根
Nginx 的 ssl_certificate 必须只含「叶证书 + 中间证书」,绝对不能包含任何根证书,更不能包含已过期的交叉根:
- 执行:
awk '/BEGIN CERTIFICATE/{i++} END{print i}' /path/to/fullchain.pem—— 正常应为 2(域名证 + 中间证),若为 3 或更多,需逐段检查 - 用
openssl x509 -in /path/to/fullchain.pem -noout -text | grep -A1 "Subject:"分段查看,确认第二段是中间 CA(如CN=Let's Encrypt R3),第三段绝不能是CN=ISRG Root X1或其他根名称 - 常见错误来源:手动合并时复制了
chain.pem或从 Certbot 的archive/目录取错文件;或用了某些脚本把root.pem也追加进去了
验证服务端实际发送的证书链
即使本地文件正确,也要确认 Nginx 真正发出去的是什么:
- 运行:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -showcerts 2>/dev/null | openssl x509 -noout -serial -dates -issuer -subject 2>/dev/null | sed -n '/^subject/p; /^issuer/p; /^notAfter/p' - 对比输出段数与本地 fullchain.pem 是否一致;重点核对最后一段的
notAfter时间 - 若线上返回的链里出现了已过期的交叉根,说明 Nginx 配置指向了错误的 PEM 文件,或 reload 未生效
修复并验证
修正后务必全流程验证:
- 清理 fullchain.pem:保留第一段(你的域名证书),第二段(中间证书,如 R3),删掉所有后续段;确保无空行、无私钥、无注释
- 重载 Nginx:
nginx -t && nginx -s reload - 再跑一次
openssl s_client命令,确认只输出两段,且第二段 notAfter 远晚于 2026-09-15 - 用
curl -v https://your-domain.com 2>&1 | grep "SSL certificate"观察是否不再报 warning - 最后用 SSL Labs 测试,确认 “Certificate Chain” 栏无红标,“Chain issues” 显示 None


















