什么是双向 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 解决的是通道身份,不解决「这个身份能做什么」:应用级授权仍要在业务层逐请求校验,二者配合使用。
证书有效期无人监控会引发大面积调用失败:轮换必须自动化并提前告警,人工换证书在规模上去之后必然出事。