双向 TLS(mTLS)

客户端与服务端互相验证证书,适用于服务间或企业与平台之间的强身份通道;证书生命周期管理(签发、轮换、吊销)是落地的主要工作量。

什么是双向 TLS

双向 TLS(mTLS)在标准 TLS 之上要求客户端也出示证书:服务端校验客户端证书链与标识,客户端同样校验服务端。它把通道身份从「谁都能连」变成「只有持有合法证书的实体能连」,适合服务间通信与企业与平台之间的对接。落地的主要工作量不在协议本身,而在证书的签发、轮换、监控与吊销。

基本信息

验证流程双方校验证书链、有效期与标识(主机名或 URI 标识)
身份绑定证书主体绑定服务或应用身份,而非具体 IP
运维重点自动签发与轮换、到期监控、吊销与信任链更新
能力边界只解决通道层身份,不解决应用级授权

典型使用场景

  • 服务间通信:内部服务互相校验证书,防止未授权进程接入
  • 企业与平台对接:为合作方签发专属证书,便于审计与吊销
  • 控制面与数据面:边车与控制平面之间用 mTLS 建立可信通道
  • 设备接入:为每台设备签发唯一证书,替代共享口令
  • 跨机房链路:在不完全可信的网络上建立加密且双向认证的通道
  • 合规要求:需要证明通信双方身份的数据传输场景

证书运维清单

环节做法失败后果
签发内部 CA 自动签发,证书绑定服务身份手工签发导致口径不一
轮换到期前自动换发,双证书过渡到期即大面积调用失败
监控到期告警与握手失败率监控证书过期无预警
吊销离职与下线流程中同步吊销旧凭证仍能接入系统
信任链根证书分发与更新流程明确更新根证书时全网断连

握手与排障要点

握手与排障要点
# 用 openssl 验证双向握手(示意)
openssl s_client -connect api.internal:443 \
  -cert client.crt -key client.key -CAfile ca.crt -verify_return_error
# 关注输出中的
#   Verify return code: 0 (ok)               证书链校验结果
#   Peer certificate / subject                对端身份标识
# 常见失败原因
#   unknown ca            对端不信任你的根证书
#   certificate expired   任一侧证书过期
#   hostname mismatch     标识与实际访问名不一致
mTLS 解决的是通道身份,不解决「这个身份能做什么」:应用级授权仍要在业务层逐请求校验,二者配合使用。
证书有效期无人监控会引发大面积调用失败:轮换必须自动化并提前告警,人工换证书在规模上去之后必然出事。

易错点

  • 证书有效期无人监控,集中到期引发大面积调用失败
  • 吊销机制缺失,离职人员或下线设备的证书仍可接入
  • 把通道身份当作授权依据,持有证书即可调用全部接口
  • 证书只绑 IP 不绑服务身份,实例迁移后身份校验失去意义

数据来源与参考

  • RFC 8446:TLS 1.3
  • Istio 文档:Mutual TLS
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌