mTLS 握手失败排查:证书、信任链与身份匹配

利用 openssl 和代理日志区分证书过期、CA 不信任、SAN 错误、协议不兼容与客户端证书缺失。

文章目录 · 4 节

mTLS 在服务端证书验证之外,还要求客户端提供可被服务端信任的证书。错误经代理包装后常只剩 503,因此要在握手层确认失败方向。

从客户端复现

openssl s_client -connect api.example.com:443 \
  -servername api.example.com \
  -cert client.crt -key client.key \
  -CAfile ca.crt -verify_return_error -showcerts

检查证书链、有效期、SAN、签名算法和 verify code。-servername 不可省略,否则多域名入口可能返回错误证书。

检查服务端要求

openssl x509 -in client.crt -noout -subject -issuer -dates -ext extendedKeyUsage
openssl verify -CAfile client-ca.pem client.crt

客户端证书通常需要 clientAuth EKU。服务网格中还要核对 PeerAuthentication、DestinationRule、SNI 和工作负载身份是否一致。

常见原因

  • 一端已轮换 CA,另一端仍使用旧 trust bundle
  • 系统时钟漂移导致证书尚未生效或已过期
  • 证书链缺少中间 CA
  • TLS 版本、密码套件或椭圆曲线没有交集

收尾清单

修复后分别验证双向身份和失败场景,不能只确认 TCP 端口开放。监控证书有效期、握手错误率和身份签发延迟,并演练 CA 重叠轮换。