OpenSSL验证时会因证书链循环引用而报错,需用openssl verify命令检测并逐级解析issuer/subject关系;若发现issuer等于自身subject或与链中已有证书subject重复,即存在循环,应移除fullchain.pem中的根证书。
apache 本身不会因证书链循环引用而直接报错,但 openssl 在验证时会检测到并明确拒绝——这是排查的起点。
用 OpenSSL 主动触发验证,看是否报循环错误
循环引用本质是证书 A 的签发者指向证书 B,而 B 的签发者又回指 A(或经多跳闭环),OpenSSL 验证器会在构建信任路径时发现环路并中断。执行以下命令:
-
基础验证命令:
openssl verify -CAfile /etc/ssl/certs/ca-bundle.crt fullchain.pem - 若出现类似
error 24 at 0 depth lookup: invalid CA certificate或更关键的error 20 at 0 depth lookup: unable to get local issuer certificate,需进一步确认是否为循环所致 - 加
-verbose参数重试:openssl verify -verbose -CAfile /etc/ssl/certs/ca-bundle.crt fullchain.pem,观察输出中是否反复出现同一证书的 issuer/subject 匹配
逐级解析证书,人工检查 issuer 和 subject 是否成环
把 fullchain.pem 拆成单个证书,分别查看其签发关系:
- 提取第1张(域名证书):
sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' fullchain.pem | head -n 20 | openssl x509 -noout -subject -issuer - 提取第2张(中间证书):
sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' fullchain.pem | tail -n +21 | head -n 20 | openssl x509 -noout -subject -issuer - 对比每张证书的 issuer(谁签的它)和下一张的 subject(它是谁),必须严格一致;若某张证书的 issuer 等于自身 subject,或与链中已出现过的某张证书 subject 完全相同,即存在循环
检查是否误将根证书放入 fullchain.pem
根证书不应出现在 SSLCertificateFile 指向的文件中。一旦混入,OpenSSL 可能尝试用它去验证自己,导致逻辑闭环:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
openssl x509 -in root.crt -noout -text | grep -A1 "CA:"确认是否为自签名(CA:TRUE且issuer == subject) - 若 fullchain.pem 末尾含此类证书,立即删掉——只保留域名证书 + 中间证书(按签发顺序)
- 根证书应由客户端预置,服务端发送它不仅无用,反而干扰链式校验
借助在线工具交叉验证
上传 fullchain.pem 到 SSL Shopper 解码器 或 decoder.link,查看每张证书的 “Issued By” 字段是否形成非线性指向。如果显示 “Self-signed” 出现在中间位置,或某张证书的颁发者在链中找不到对应 subject,基本可判定存在循环或错序。










