

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

# 传输层安全性协议 (TLS)
<a name="tls"></a>

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

在 App Mesh 中，传输层安全性协议 (TLS) 对部署在计算资源上的 Envoy 代理之间的通信进行加密，这些资源在 App Mesh 中由网格端点表示，例如 [虚拟节点](virtual_nodes.md) 和 [虚拟网关](virtual_gateways.md)。代理协商并终止 TLS。当代理与应用程序一起部署时，您的应用程序代码不负责协商 TLS 会话。代理代表您的应用程序协商 TLS。

App Mesh 允许您通过以下方式向代理提供 TLS 证书：
+ 来自 Amazon Certificate Manager (ACM) 的私有证书，由 Amazon 私有证书颁发机构 (Amazon 私有 CA) 颁发。
**注意**  
ACM， Amazon 私有 CA 不在中国区域提供。
+ 存储在虚拟节点本地文件系统中的证书，由您自己的证书颁发机构 (CA) 颁发 
+ 由密钥发现服务 (SDS) 端点通过本地 Unix 域套接字提供的证书。

[Envoy Proxy 授权](proxy-authorization.md) 必须为由网格端点表示的已部署的 Envoy 代理启用。我们建议您在启用代理授权时，将访问限制为仅访问您启用加密的网状端点。

## 证书要求
<a name="virtual-node-tls-prerequisites"></a>

证书上的主题备用名称 (SANs) 之一必须符合特定标准，具体取决于网格端点所代表的实际服务的发现方式。
+ **DNS** — 其中一个证书 SANs 必须与 DNS 服务发现设置中提供的值相匹配。对于具有服务发现名称的应用程序 `mesh-endpoint.apps.local`，您可以创建与该名称匹配的证书，也可以创建带有通配符的证书 `*.apps.local`。
+ **Amazon Cloud Map**— 其中一个证书 SANs 必须与使用格式的 Amazon Cloud Map 服务发现设置中提供的值相匹配`service-name.namespace-name`。对于 Amazon Cloud Map 服务发现设置为 Service `apps.local` Name 和 Namespac `mesh-endpoint` eName 的应用程序，您可以创建与`mesh-endpoint.apps.local`名称匹配的证书，或者使用通配符创建证书 `*.apps.local.`

对于这两种发现机制，如果没有一个证书 SANs 与 DNS 服务发现设置匹配，则 Envoy 之间的连接将失败，并显示以下错误消息，如客户端 Envoy 所示。

```
TLS error: 268435581:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
```

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

使用 TLS 身份验证时，App Mesh 支持多种证书来源。

**Amazon 私有 CA**  
此功能在中国区域中不可用。
证书必须存储在 ACM 中，其区域和 Amazon 账户必须与使用该证书的网格端点相同。CA 的证书不必位于同一个 Amazon 账户中，但它仍然需要与网格端点位于同一个区域。如果您没有 Amazon 私有 CA，则必须先[创建一个](https://docs.amazonaws.cn/acm-pca/latest/userguide/PcaCreateCa.html)，然后才能向其申请证书。有关 Amazon 私有 CA 使用 ACM 向现有证书申请证书的更多信息，请参阅[申请私有证书](https://docs.amazonaws.cn/acm/latest/userguide/gs-acm-request-private.html)。该证书不能是公共证书。  
您用于 TLS 客户端策略的私 CAs 有用户必须是 root 用户 CAs。  
要使用证书和 CAs 来自配置虚拟节点 Amazon 私有 CA，用于调用 App Mesh 的委托人（例如用户或角色）必须具有以下 IAM 权限：  
+ 对于添加到侦听器的 TLS 配置中的任何证书，主体必须具有 `acm:DescribeCertificate` 权限。
+ 对于在 TLS 客户端策略上 CAs 配置的任何内容，委托人必须拥有`acm-pca:DescribeCertificateAuthority`权限。
 CAs 与其他账户共享可能会将这些账户授予 CA 意想不到的权限。我们建议使用基于资源的策略来限制访问无需从 CA 颁发证书的账户的 `acm-pca:DescribeCertificateAuthority` 和 `acm-pca:GetCertificateAuthorityCertificate`。
您可以将这些权限添加到附加到主体的现有 IAM 策略中，也可以创建新的主体和策略并将该策略附加到主体。有关更多信息，请参阅[编辑 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-edit.html)、[创建 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create-console.html)和[添加 IAM 身份权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。  
在将其删除 Amazon 私有 CA 之前，您需要为每个操作支付月费。您还需要为每月颁发的私有证书和导出的私有证书付费。有关更多信息，请参阅[Amazon Certificate Manager 定价](https://www.amazonaws.cn//certificate-manager/pricing/)。
当您为网状端点所代表的 Envoy [代理启用代理授权](proxy-authorization.md)时，必须为您使用的 IAM 角色分配以下 IAM 权限：  
+ 对于在虚拟节点的侦听器上配置的任何证书，该角色必须具有 `acm:ExportCertificate` 权限。
+ 对于在 TLS 客户端策略上 CAs 配置的任何内容，该角色都必须具有`acm-pca:GetCertificateAuthorityCertificate`权限。

**文件系统**  
您可以使用文件系统向 Envoy 分发证书。您可以通过在文件路径上提供证书链和相应的私钥来实现此目的。这样，就可以通过 Envoy sidecar 代理访问这些资源。

**Envoy 密钥发现服务 (SDS)**  
Envoy 通过密钥发现协议从特定端点获取 TLS 证书等密钥。有关此协议的更多信息，请参阅 Envoy 的 [SDS 文档](https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret)。  
当 SDS 作为证书和证书链的来源时，App Mesh 将 Envoy 代理配置为使用代理本地的 Unix 域套接字作为密钥发现服务 (SDS) 端点。您可以使用 `APPMESH_SDS_SOCKET_PATH` 环境变量配置此端点的路径。  
App Mesh Envoy 代理版本 1.15.1.0 及更高版本支持使用 Unix 域套接字的本地密钥发现服务。  
App Mesh 支持使用 gRPC 的 V2 SDS 协议。

**与 SPIFFE 运行时系统环境 (SPIRE) 集成**  
您可以使用 SDS API 的任何 sidecar 实现，包括 [SPIFFE 运行时环境 (SPIRE)](https://github.com/spiffe/spire) 等现有工具链。SPIRE 旨在支持在分布式系统中的多个工作负载之间部署双向 TLS 身份验证。它在运行时证明了运行时系统的身份。SPIRE 还为工作负载提供适用于特定工作负载的、短期的、自动轮换的密钥和证书。  
您应该将 SPIRE 代理配置为 Envoy 的 SDS 提供商。允许它直接向 Envoy 提供提供双向 TLS 身份验证所需的密钥材料。在 Envoy 代理旁的 sidecar 中运行 SPIRE 代理。代理负责根据需要重新生成短期密钥和证书。代理会证明 Envoy，并确定当 Envoy 连接到 SPIRE 代理暴露的 SDS 服务器时，它应该向 Envoy 提供哪些服务身份和 CA 证书。  
在此过程中，将轮换服务身份和 CA 证书，并将更新流式传输回 Envoy。Envoy 会立即将它们应用于新连接，不会出现任何中断或停机，也不会让私钥接触文件系统。

## App Mesh 如何配置 Envoy 以协商 TLS
<a name="envoy-configuration-tls"></a>

在确定如何配置网格中 Envoy 之间的通信时，App Mesh 使用客户端和服务器的网格端点配置。

**使用客户端策略**  
当客户端策略强制使用 TLS，并且客户端策略中的一个端口与服务器策略的端口匹配时，该客户端策略用于配置客户端的 TLS 验证上下文。例如，如果虚拟网关的客户端策略与虚拟节点的服务器策略相匹配，则将使用虚拟网关的客户端策略中定义的设置在代理之间尝试 TLS 协商。如果客户端策略与服务器策略的端口不匹配，则代理之间的 TLS 可能会协商，也可能不协商，具体取决于服务器策略的 TLS 设置。

**没有客户端策略**  
如果客户端尚未配置客户端策略，或者客户端策略与服务器的端口不匹配，App Mesh 将使用服务器来确定是否与客户端协商 TLS 以及如何协商。例如，如果虚拟网关未指定客户端策略，并且虚拟节点未配置 TLS 终止，则代理之间将不会协商 TLS。如果客户端未指定匹配的客户端策略，并且服务器已配置为 TLS 模式 `STRICT` 或 `PERMISSIVE`，则代理将被配置为协商 TLS。根据为 TLS 终止提供证书的方式，将适用以下其他行为。  
+ **ACM 管理的 TLS 证书** — 当服务器使用 ACM 管理的证书配置 TLS 终止时，App Mesh 会自动将客户端配置为协商 TLS，并根据证书链接到的根用户 CA 验证证书。
**注意**  
ACM 管理的 TLS 证书在中国区域不可用。
+ **基于文件的 TLS 证书** — 当服务器使用来自代理本地文件系统的证书配置 TLS 终止时，App Mesh 会自动将客户端配置为协商 TLS，但服务器的证书未经过验证。

**主题备用名称**  
您可以选择指定要信任的主题备用名称 (SANs) 列表。 SANs 必须采用 FQDN 或 URI 格式。如果提供 SANs ，Envoy 将验证所提供证书的主题备用名称是否与此列表中的一个名称匹配。  
如果您未在终止网格端点 SANs 上指定，则该节点的 Envoy 代理不会在对等客户端证书上验证 SAN。如果您未在原始网状端点 SANs 上指定，则终止端点提供的证书上的 SAN 必须与网状端点服务发现配置相匹配。  
有关更多信息，请参阅 App Mesh [TLS：证书要求](https://docs.amazonaws.cn/app-mesh/latest/userguide/tls.html#virtual-node-tls-prerequisites)。  
只有将 TLS 的客户端策略设置为，您才能使用通配符 SANs 。`not enforced`如果将客户端虚拟节点或虚拟网关的客户端策略配置为强制执行 TLS，则它不能接受通配符 SAN。

## 验证加密
<a name="verify-encryption"></a>

启用 TLS 后，您可以查询 Envoy 代理以确认通信已加密。Envoy 代理会发出有关资源的统计信息，这些统计数据可以帮助您了解 TLS 通信是否正常运行。例如，Envoy 代理记录其为指定网格端点协商成功的 TLS 握手次数的统计信息。使用以下命令确定命名的网格端点成功的 TLS 握 `my-mesh-endpoint` 手次数。

```
curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep ssl.handshake
```

在以下示例返回的输出中，网格端点进行了三次握手，因此通信已加密。

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

当 TLS 协商失败时，Envoy 代理还会发出统计信息。确定网格端点是否存在 TLS 错误。

```
curl -s 'http://my-mesh-endpoint.apps.local:9901/stats' | grep -e "ssl.*\(fail\|error\)"
```

在返回的输出示例中，多个统计数据没有错误，因此 TLS 协商成功。

```
listener.0.0.0.0_15000.ssl.connection_error: 0
listener.0.0.0.0_15000.ssl.fail_verify_cert_hash: 0
listener.0.0.0.0_15000.ssl.fail_verify_error: 0
listener.0.0.0.0_15000.ssl.fail_verify_no_cert: 0
listener.0.0.0.0_15000.ssl.ssl.fail_verify_san: 0
```

有关 Envoy TLS 统计信息的更多信息，请参阅 [Envoy 侦听器统计信息](https://www.envoyproxy.io/docs/envoy/latest/configuration/listeners/stats)。

## 证书续订
<a name="certificate-renewal"></a>

**Amazon 私有 CA**  
当您使用 ACM 续订证书时，续订的证书将在续订完成后的 35 分钟内自动分发给您连接的代理。我们建议使用托管续订来自动续订即将到期的证书。有关更多信息，请参阅《用户指南》中的 [ACM 亚马逊颁发的证书的托管续订](https://docs.amazonaws.cn/acm/latest/userguide/managed-renewal.html)。 Amazon Certificate Manager 

**重要**  
ACM， Amazon 私有 CA 不在中国区域提供。

**您自己的证书**  
使用来自本地文件系统的证书时，Envoy 不会在证书更改时自动重新加载证书。您可以重新启动或重新部署 Envoy 进程来加载新证书。您还可以将较新的证书放在不同的文件路径中，并使用该文件路径更新虚拟节点或网关配置。

## 将 Amazon ECS 工作负载配置为使用 TLS 身份验证 Amazon App Mesh
<a name="mtls-configure-ecs"></a>

您可以将网格配置为使用 TLS 身份验证。确保证书可供您添加到工作负载中的 Envoy 代理 sidecar 使用。您可以将 EBS 或 EFS 卷附加到您的 Envoy sidecar，也可以从 Amazon Secrets Manager 存储和检索证书。
+ 如果您使用基于文件的证书分发，请将 EBS 或 EFS 卷附加到您的 Envoy sidecar。确保证书和私钥的路径与中配置的路径相匹配 Amazon App Mesh。
+ 如果您使用的是基于 SDS 的发行版，请添加一个实现 Envoy 的 SDS API 并访问证书的 sidecar。

**注意**  
亚马逊 ECS 不支持 SPIRE。

## 将 Kubernetes 工作负载配置为使用 TLS 身份验证 Amazon App Mesh
<a name="mtls-configure-kubernetes"></a>

您可以将 Kubernetes Amazon App Mesh 控制器配置为为虚拟节点和虚拟网关服务后端和侦听器启用 TLS 身份验证。确保证书可供您添加到工作负载中的 Envoy 代理 sidecar 使用。您可以在双向 TLS 身份验证的[演练](https://docs.amazonaws.cn/app-mesh/latest/userguide/mutual-tls.html#mtls-walkthrough)部分中查看每种分发类型的示例。
+ 如果您使用基于文件的证书分发，请将 EBS 或 EFS 卷附加到您的 Envoy sidecar。确保证书和私钥的路径与控制器中配置的路径相匹配。或者，您可以使用挂载在文件系统上的 Kubernetes 密钥。
+ 如果您使用的是基于 SDS 的发行版，您应该设置一个实现 Envoy 的 SDS API 的节点本地 SDS 提供商。Envoy 将通过 UDS 找到它。要在 EKS AppMesh 控制器中启用基于 SDS 的 mTLS 支持，请将该`enable-sds`标志设置为，`true`并通过该标志提供本地 SDS 提供商到控制器的 UDS 路径。`sds-uds-path`如果您使用 helm，则可以在控制器安装过程中设置以下内容：

  ```
  --set sds.enabled=true
  ```

**注意**  
如果您在 Fargate 模式下使用 Amazon Elastic Kubernetes Service (Amazon EKS)，则无法使用 SPIRE 分发证书。