

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 双向 TLS 身份验证
<a name="mutual-tls"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后，您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 AWS App Mesh 到 Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

双向 TLS（传输层安全）身份验证是 TLS 的可选组件，可提供双向对等身份验证。双向 TLS 身份验证在 TLS 的基础上增加了一层安全性，并允许您的服务验证正在建立连接的客户端。

客户端-服务器关系中的客户端还会在会话协商过程中提供 X.509 证书。服务器使用此证书来识别和验证客户端。此过程有助于验证证书是否由可信证书颁发机构 (CA) 颁发，以及该证书是否为有效证书。它还使用证书上的主题备用名称 (SAN) 来识别客户端。

您可以为支持的所有协议启用双向 TLS 身份验证 AWS App Mesh。它们是 TCP、HTTP/1.1、HTTP/2、gRPC。

**注意**  
使用 App Mesh，您可以为来自您的服务的 Envoy 代理之间的通信配置双向 TLS 身份验证。但是，您的应用程序与 Envoy 代理之间的通信未加密。

## 双向 TLS 身份验证证书
<a name="mtls-certificates"></a>

AWS App Mesh 支持双向 TLS 身份验证的两种可能的证书来源。TLS 客户端策略中的客户端证书和侦听器 TLS 配置中的服务器验证可以从以下来源获取：
+ **文件系统 -** 来自正在运行的 Envoy 代理的本地文件系统的证书。要向 Envoy 分发证书，您需要提供证书链的文件路径和 App Mesh API 的私钥。
+ E@@ **nvoy 的秘密发现服务 (SDS) —** 实施 SDS 并允许向 Envoy 发送证书的 Bring-your-own边车。它们包括 SPIFFE 运行时系统环境 (SPIRE)。

**重要**  
App Mesh 不存储用于双向 TLS 身份验证的证书或私钥。相反，Envoy 会将它们存储在内存中。

## 配置网格端点
<a name="mtls-configure-mesh-endpoints"></a>

为您的网格端点（例如虚拟节点或网关）配置双向 TLS 身份验证。这些端点提供证书并指定可信机构。

为此，您需要为客户端和服务器配置 X.509 证书，并在 TLS 终止和 TLS 来源的验证上下文中明确定义可信机构证书。

**网格内部的信任**  
服务器端证书在虚拟节点侦听器（TLS 终止）中配置，客户端证书在虚拟节点服务后端（TLS 发起）中配置。作为此配置的替代方案，您可以为虚拟节点的所有服务后端定义默认的客户端策略，然后，如果需要，可以根据需要为特定后端覆盖此策略。虚拟网关只能使用适用于其所有后端的默认客户端策略进行配置。  
您可以通过为两个网格的虚拟网关上的入站流量启用双向 TLS 身份验证来配置不同网格之间的信任。

**网格之外的信任**  
在虚拟网关侦听器中指定服务器端证书以终止 TLS。配置与您的虚拟网关通信的外部服务以提供客户端证书。证书应派生自服务器端证书在虚拟网关侦听器上用于发起 TLS 的证书颁发机构之一 (CAs)。

## 将服务迁移到双向 TLS 身份验证
<a name="mtls-migrating-services"></a>

在 App Mesh 中将现有服务迁移到双向 TLS 身份验证时，请遵循以下准则以保持连接。

**迁移服务通过明文进行通信**

1. 在服务器端点上启用 TLS 配置 `PERMISSIVE` 模式。此模式允许纯文本流量连接到端点。

1. 在服务器上配置双向 TLS 身份验证，指定服务器证书、信任链以及可选的可信证书 SANs。

1. 确认通信是通过 TLS 连接进行的。

1. 在您的客户端上配置双向 TLS 身份验证，指定客户端证书、信任链以及可选的可信证书 SANs。

1. 在服务器上启用 TLS 配置的 `STRICT` 模式。

**迁移通过 TLS 通信的服务**

1. 在您的客户端上配置双向 TLS 设置，指定客户端证书和可信证书（可选） SANs。直到后端服务器请求客户端证书后，才会将其发送到其后端。

1. 在服务器上配置双向 TLS 设置，指定信任链，也可以指定信任链 SANs。为此，您的服务器会请求客户端证书。

## 验证双向 TLS 身份验证
<a name="mtls-verification"></a>

您可以参阅[传输层安全：验证加密](https://docs.aws.amazon.com/app-mesh/latest/userguide/tls.html#verify-encryption)文档，了解 Envoy 究竟是如何发出与 TLS 相关的统计数据的。对于双向 TLS 身份验证，您应该检查以下统计信息：
+ `ssl.handshake`
+ `ssl.no_certificate`
+ `ssl.fail_verify_no_cert`
+ `ssl.fail_verify_san`

以下两个统计示例共同表明，成功端接到虚拟节点的 TLS 连接都来自提供证书的客户端。

```
listener.0.0.0.0_15000.ssl.handshake: 3
```

```
listener.0.0.0.0_15000.ssl.no_certificate: 0
```

下一个统计数据示例显示，从虚拟客户端节点（或网关）到后端虚拟节点的连接失败。服务器证书中显示的主题备用名称 (SAN) 与客户端 SANs 信任的任何名称都不匹配。

```
cluster.cds_egress_my-mesh_my-backend-node_http_9080.ssl.fail_verify_san: 5
```

## App Mesh 双向 TLS 身份验证演练
<a name="mtls-walkthrough"></a>
+  [双向 TLS 身份验证演练](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-mutual-tls-file-provided)：本演练描述了如何使用 App Mesh CLI 构建具有双向 TLS 身份验证的彩色应用程序。
+  [Amazon EKS 基于双向 TLS SDS 的演练](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-mtls-sds-based)：本演练展示了如何在 Amazon EKS 和 SPIFFE 运行时系统环境 (SPIRE) 中使用基于双向 TLS SDS 的身份验证。
+  [亚马逊 EKS 基于双向 TLS 文件的演练](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-mtls-file-based)：本演练展示了如何在 Amazon EKS 和 SPIFFE 运行时系统环境 (SPIRE) 中使用基于双向 TLS 文件的身份验证。