3. mTLS 双向认证原理
在服务网格中,mTLS(双向传输层安全性协议)是构建零信任网络的核心技术。它要求通信双方在建立 TLS 连接时,不仅要验证服务器的身份,还要验证客户端的身份,从而确保网格内每个工作负载之间的通信都是经过双向认证和加密的。
3.1 标准 TLS 握手过程
理解 mTLS 之前,必须先掌握标准 TLS 1.3 握手的核心步骤。以下流程图展示了客户端与服务器之间建立加密通道的完整过程:
3.2 单向 TLS vs 双向 TLS
单向 TLS 和双向 TLS 的核心区别在于证书验证的方向。在服务网格中,mTLS 要求双方都出示并验证证书,而标准 TLS 仅验证服务器证书。
| 对比维度 | 单向 TLS(标准 HTTPS) | 双向 TLS(mTLS) |
|---|---|---|
| 证书验证方向 | 客户端 → 验证服务器证书 | 客户端 ↔ 服务端,双向验证证书 |
| 客户端证书 | 不需要 | 必须提供并验证 |
| 服务器证书 | 必须提供并验证 | 必须提供并验证 |
| 身份确认 | 仅确认服务器身份 | 确认通信双方身份 |
| 适用场景 | Web 浏览器访问网站 | 服务网格、API 网关、微服务间通信 |
| 安全等级 | 防止中间人攻击(单向) | 防止中间人攻击 + 客户端伪造 |
| 证书管理复杂度 | 低(仅管理服务端证书) | 高(需管理所有工作负载的证书) |
核心要点:在 Istio 等服务网格中,mTLS 是默认的通信模式。每个 Sidecar 代理(Envoy)都持有由网格 CA 签发的身份证书,确保网格内所有流量都经过双向认证和加密。
3.3 客户端证书与服务器证书的验证流程
mTLS 握手在标准 TLS 基础上增加了客户端证书的请求与验证环节。以下流程图展示了完整的双向验证过程:
3.4 证书验证的关键步骤
在 mTLS 握手过程中,证书验证是安全性的核心保障。以下是双方证书验证的详细步骤:
3.4.1 服务器证书验证(由客户端执行)
- 证书链验证:客户端使用本地信任存储中的根 CA 证书,逐级验证服务器证书链的签名,确保证书由受信任的证书颁发机构签发。
- 有效期检查:验证服务器证书的
notBefore和notAfter字段,确保证书在当前时间有效。 - 身份匹配:在服务网格中,验证证书中的 SPIFFE ID(如
spiffe://cluster.local/ns/default/sa/sleep)是否与目标服务的预期身份一致。 - 吊销状态检查:通过 CRL(证书吊销列表)或 OCSP(在线证书状态协议)检查证书是否已被吊销。
3.4.2 客户端证书验证(由服务端执行)
- 证书链验证:服务端使用网格 CA 证书验证客户端证书链,确保证书由网格内部 CA 签发。
- 有效期检查:验证客户端证书是否在有效期内,防止使用过期或未生效的证书。
- SPIFFE ID 验证:检查客户端证书中的 SPIFFE ID 是否属于允许访问该服务的身份列表。
- 密钥用途验证:确保证书的
Extended Key Usage字段包含clientAuth属性。
实践建议:在 Istio 中,mTLS 证书验证由 Envoy 代理自动完成。您可以通过 PeerAuthentication 资源配置 mTLS 模式(STRICT / PERMISSIVE / DISABLE),并通过 AuthorizationPolicy 基于 SPIFFE ID 实现细粒度的访问控制。
3.5 mTLS 在服务网格中的优势
| 安全特性 | 实现方式 | 防护效果 |
|---|---|---|
| 身份认证 | 基于 SPIFFE ID 的证书 | 确保每个工作负载都有唯一身份 |
| 传输加密 | TLS 1.3 对称加密 | 防止流量窃听和中间人攻击 |
| 双向验证 | 客户端 + 服务端证书 | 防止未授权的客户端访问服务 |
| 证书轮换 | 自动证书管理(如 Istio CA) | 降低私钥泄露风险,实现零信任 |
| 细粒度控制 | 基于身份的授权策略 | 实现最小权限原则 |
注意事项:启用 mTLS 后,所有网格内的流量都会经过加密和认证,这可能会带来 5%-10% 的性能开销(取决于证书验证频率和加密算法)。在生产环境中,建议使用 TLS 1.3 和高效的密码套件(如 ECDHE + AES-GCM)来最小化性能影响。