AxionserveSign in / RegisterEnglish/中文/cn繁体/tw

SSL 全链路排查:证书、中间证书与 SNI

HTTPS 打不开/红锁/部分设备报错的系统排查法:证书链四层结构、SNI 工作机制、六类高频故障(缺中间证书、过期、域名不匹配、协议不匹配等)的定位命令与修复动作。

· AxionServe 编辑部 · 决策情报

HTTPS 故障的阴险之处在于症状与根因的距离:浏览器只显示一个红锁,根因可能在证书链、SNI、协议版本、时钟里的任何一层;更常见的是「我的电脑好的、客户打不开」——不同设备与系统对链缺失的容忍度不同。本篇是域名与 DNS 中心的排查实战篇:把 SSL 全链路拆成可逐层验证的四段,六类高频故障各给定位命令与修复动作。

证书链四层结构示意

先懂结构:证书链与 SNI 是怎么工作的

  • 证书链四层:根证书(系统内置信任锚)→ 中间证书(根签发,可多级)→ 服务器证书(叶子,你的域名)→ 浏览器验证(沿链上溯到信任锚)。服务器必须把叶子 + 中间证书一起发(fullchain),只发叶子时,能自动补链的桌面浏览器「看起来正常」,手机与老系统直接报错——「部分设备打不开」的第一嫌疑人;
  • SNI(Server Name Indication):TLS 握手第一个包(ClientHello)里明文携带目标域名,让同一 IP 上的多站点证书各归各位。极老客户端不发 SNI → 拿到默认证书 → 域名不匹配报错;一台服务器多域名时,SNI 配置错误 = 张冠李戴。

逐层验证命令(从下往上排)

# ① 服务器发了什么:完整链 + 协议 + SNI 行为
echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2>/dev/null | grep -E "s:|i:|Verify"
#   s:=每级证书主体 i:=签发者;Verify return code: 0 (ok) 才算链完整
# ② 不带 SNI 试一次(模拟老客户端,多域名服务器必测)
echo | openssl s_client -connect 服务器IP:443 2>/dev/null | grep "s:"
# ③ 证书细节:有效期、域名覆盖、签发者
echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2>/dev/null | openssl x509 -noout -dates -subject -ext subjectAltName
# ④ 客户端视角复现(-v 看握手全过程,--resolve 绕过 DNS 直测服务器)
curl -vI https://你的域名/ --resolve 你的域名:443:服务器IP 2>&1 | grep -E "SSL|subject|issuer|expire|HTTP"
# ⑤ 协议与加密套集体检(老设备兼容 vs 安全水位的平衡)
openssl s_client -connect 你的域名:443 -tls1_2 </dev/null 2>/dev/null | grep -c "BEGIN CERT"   # ≥2 = 链完整

六类高频故障速查

症状根因定位修复
手机/老系统报错,桌面正常缺中间证书①的链输出只有一级部署 fullchain.pem(叶子+中间)
红锁:证书过期续签失败/忘续③的 notAfter 已过换证 + 把到期监控加进拨测(certbot 续签测试 --dry-run)
域名不匹配SAN 没含访问域名/www③的 subjectAltName 清单重签时列全所有主机名(含 www 与裸域)
多站点串证书SNI 配置错②不带 SNI 拿到默认证书核对 vhost/ server 块的 server_name 与证书对应关系
老设备握手失败只开了 TLS1.3 或加密套件过窄⑤分协议试握手开 TLS1.2+1.3 双协议,套件取主流兼容集
时好时坏/部分地区报错负载均衡后端证书不一致或时钟漂移--resolve 逐后端 IP 测全后端统一证书 + NTP 对时

修复后的回归清单

# 每次动证书后跑一遍(5 分钟):
echo | openssl s_client -connect 域名:443 -servername 域名 2>/dev/null | grep "Verify return code"   # 0 (ok)
curl -sI https://域名/ | head -1                          # HTTP/2 或 1.1 200
curl -sI http://域名/ | grep -i location                  # 80 → 443 跳转在位
echo | openssl s_client -connect 域名:443 -servername 域名 2>/dev/null | openssl x509 -noout -enddate  # 新到期日
# 手机 4G/5G(非 Wi-Fi)实开一次 —— 移动网络是最容易被忽略的验证面

免费证书与付费证书:怎么选

Let's Encrypt 系免费 DV 证书与付费证书的差别不在加密强度(算法与密钥长度同档),而在四件事:①验证级别——免费只有 DV(验证域名控制权);付费可选 OV(验证组织)与 EV(扩展验证),对「证明公司身份」有需求的(金融、政企投标)才用得上;②有效期与自动化——免费证书有效期短(以 CA 当前政策为准),必须配自动续签(certbot 类),自动化链路本身就是运维资产;付费证书有效期长但换证是手动大动作;③保障与售后——付费证书带保险赔付与厂商支持,投标与合规场景常是硬要求;④兼容性长尾——主流免费 CA 的根证书在近十年设备上覆盖率已经很好,极老设备(XP 时代)场景才需要专门核对根证书清单。口径:常规站点用免费 DV + 自动续签 + 到期监控,身份展示与合规场景上 OV/EV——为「看起来更可信」买 EV 的绿条时代已经过去,浏览器早已取消 EV 视觉标识。

把证书故障挡在发生前

  • 到期监控:拨测清单里加「证书剩余天数 <20 天告警」——外贸站证书过期一天的损失以询盘计(见场景中心外贸站篇);
  • 续签演练:certbot renew --dry-run 每月跑一次,续签链路故障在演练里暴露,不在生产里暴露;
  • HSTS 谨慎开:确认 HTTPS 全链路稳定后再开 max-age 较长的 HSTS——开了之后降级回 HTTP 的路就断了(这是特性不是 bug,但要在你准备好的时候生效);
  • 变更留档:每次换证记录「时间/证书指纹/操作人」,串证书类故障回溯时省一半时间。

下一步:把①–⑤命令链对你自己的域名跑一遍,六类故障对表自查。DNS 层的上一站(解析配对才轮到证书)→ 同中心解析实操篇;全景 → 域名与 DNS 中心;服务器资源 → 在售配置。