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 重叠轮换。