中间证书混用是怎么回事
证书续期或 CA 更换中间证书时,如果只更新了一部分节点(CDN 边缘、回源、负载均衡、内网网关),就会同时存在新旧两版链。客户端拿到哪一版取决于 DNS 解析与调度,于是出现「部分用户正常、部分用户报错」的随机现象,重启浏览器或换网络又好了,很难复现。定位办法是逐个出口抓取实际发送的链,按证书指纹比对,找出仍在发旧链的节点。
基本信息
| 典型现象 | 同一域名在不同网络、不同设备上表现不一致 |
|---|---|
| 核对对象 | CDN 边缘、回源节点、负载均衡、网关、内网反代,一个都不能少 |
| 比对手段 | 逐个出口抓链后计算指纹,或列出每张证书的 subject 与 issuer |
| 常见诱因 | 续期时只换了一部分节点的 fullchain 文件 |
| 判定标准 | 所有出口发送的链指纹应完全一致 |
| 收尾动作 | 建立证书文件的统一分发与校验流程 |
典型使用场景
- 随机报错排查:客户端时好时坏,先怀疑链不一致而不是网络抖动。
- CA 更换切换:新旧中间证书并存期,核查是否所有节点都已切换。
- 续期后验证:换完证书按出口清单逐个比对链指纹,作为发布检查项。
- 多 CDN 并存:同一域名走多家 CDN 时,各家链版本可能不同步。
- 回滚准备:发现新链有问题时,能明确哪些节点需要回退到什么版本。
多出口链指纹比对
多出口链指纹比对
for ip in 203.0.113.10 203.0.113.11; do
echo -n "$ip "
echo | openssl s_client -connect $ip:443 -servername example.com -showcerts 2>/dev/null \
| openssl crl2pkcs7 -nocrl -certfile /dev/stdin | openssl pkcs7 -print_certs -noout | md5sum
done
# 指纹相同说明链一致;不同则继续看是哪张证书的 issuer 变了
# 逐个列出证书主体与签发者
# openssl s_client -connect example.com:443 -showcerts </dev/null 2>/dev/null | grep -E '^ *i:|^ *s:' | head现象与根因对照
| 现象 | 可能根因 | 核对方法 |
|---|---|---|
| 部分客户端报链不完整 | 某些节点只发叶证书或旧中间证书 | 逐出口抓链,比对证书条数 |
| 换网络后恢复正常 | 不同出口发不同链,调度随机命中 | 多网络环境重复抓取比对指纹 |
| 同一节点时好时坏 | 节点本地证书文件有多份,被不同进程加载 | 检查该节点上所有相关配置与进程 |
| 安卓正常、iOS 报错 | 客户端信任库差异叠加链不一致 | 按客户端类型与出口交叉比对 |
更换中间证书要有灰度与回滚安排:先在一个出口验证,再逐批切换,并保留旧链文件一段时间,避免全量切换后才发现兼容问题。