传输层安全 (TLS) - AWS App Mesh

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

传输层安全 (TLS)

重要

终止支持通知:2026 年 9 月 30 日, AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后,您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。如需了解更多信息,请访问此博客文章从迁移 AWS App Mesh 到 Amazon S ECS ervice Connect

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

App Mesh 允许您通过以下方式向代理提供TLS证书:

  • 来自 AWS Certificate Manager (ACM) 的私有证书,由 AWS Private Certificate Authority (AWS Private CA) 颁发。

  • 存储在虚拟节点本地文件系统中的证书,由您自己的证书颁发机构 (CA) 颁发

  • 由机密发现服务 (SDS) 端点通过本地 Unix 域套接字提供的证书。

Envoy Proxy 授权 必须为由网格端点表示的已部署的 Envoy 代理启用。我们建议您在启用代理授权时,将访问限制为仅访问您启用加密的网状端点。

证书要求

证书上的主题备用名称 (SANs) 之一必须符合特定标准,具体取决于网格端点所代表的实际服务的发现方式。

  • DNS— 其中一个证书SANs必须与DNS服务发现设置中提供的值相匹配。对于具有服务发现名称的应用程序 mesh-endpoint.apps.local,您可以创建与该名称匹配的证书,也可以创建带有通配符的证书 *.apps.local

  • AWS Cloud Map— 其中一个证书SANs必须与使用格式的 AWS Cloud Map 服务发现设置中提供的值相匹配service-name.namespace-name。对于 AWS Cloud Map 服务发现设置为serviceNamemesh-endpoint和的应用程序 namespaceName apps.local,您可以创建与名称匹配的证书mesh-endpoint.apps.local,或者使用通配符创建证书 *.apps.local.

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

TLS error: 268435581:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

TLS身份验证证书

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

AWS Private CA

证书必须存储ACM在与使用该证书的网格端点相同的区域和 AWS 账户中。CA 的证书不必位于同一个 AWS 账户中,但它仍然需要与网格端点位于同一个区域。如果您没有 AWS 私有 CA,则必须先创建一个,然后才能向其申请证书。有关向现有用户申请证书的更多信息 AWS Private CA ACM,请参阅申请私有证书。该证书不能是公共证书。

用于TLS客户端策略CAs的私有用户必须是 root 用户CAs。

要使用证书和CAs来自配置虚拟节点 AWS Private CA,用于调用 App Mesh 的主体(例如用户或角色)必须具有以下IAM权限:

  • 对于添加到监听器TLS配置中的任何证书,委托人必须具有acm:DescribeCertificate权限。

  • 对于在TLS客户端策略上CAs配置的任何内容,委托人必须具有acm-pca:DescribeCertificateAuthority权限。

重要

CAs与其他账户共享可能会将这些账户授予 CA 意想不到的权限。我们建议使用基于资源的策略来限制访问无需从 CA 颁发证书的账户的 acm-pca:DescribeCertificateAuthorityacm-pca:GetCertificateAuthorityCertificate

您可以将这些权限添加到附加到委托人的现有IAM策略中,也可以创建新的委托人和策略并将该策略附加到委托人。有关更多信息,请参阅编辑IAM策略创建IAM策略添加IAM身份权限

注意

在将其删除 AWS Private CA 之前,您需要为每个操作支付月费。您还需要为每月颁发的私有证书和导出的私有证书付费。有关更多信息,请参阅 AWS Certificate Manager 定价

当您为网格端点所代表的 Envoy 代理启用代理授权时,必须为您使用的IAM角色分配以下IAM权限:

  • 对于在虚拟节点的侦听器上配置的任何证书,该角色必须具有 acm:ExportCertificate 权限。

  • 对于在TLS客户端策略上CAs配置的任何角色,该角色都必须具有acm-pca:GetCertificateAuthorityCertificate权限。

文件系统

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

特使的秘密发现局 (SDS)

Envoy 通过密钥发现协议从特定端点获取诸如TLS证书之类的机密。有关此协议的更多信息,请参阅 Envoy 的SDS文档

当用作证书和证书链的来源时,App Mesh 将 Envoy 代理配置为使用代理本地的 Unix 域套接字SDS作为秘密发现服务 (SDS) 端点。您可以使用 APPMESH_SDS_SOCKET_PATH 环境变量配置此端点的路径。

重要

App Mesh Envoy 代理版本 1.15.1.0 及更高版本支持使用 Unix 域套接字的本地密钥发现服务。

App Mesh 支持使用 g RPC 的 V2 SDS 协议。

与SPIFFE运行时环境集成 (SPIRE)

您可以使用的任何 sidecar 实现 SDSAPI,包括SPIFFE运行时环境 () SPIRE 等现有工具链。SPIRE旨在支持在分布式系统中的多个工作负载之间部署相互TLS身份验证。它在运行时证明了运行时系统的身份。SPIRE还为工作负载提供特定于工作负载的、短期的、自动轮换的密钥和证书。

您应该将SPIRE代理配置为 Envoy 的SDS提供者。允许它直接向 Envoy 提供提供相互TLS身份验证所需的密钥材料。在 Envoy SPIRE 代理旁边的边车中运行特工。代理负责根据需要重新生成短期密钥和证书。代理会证明 Envoy,并确定在 Envoy 连接到SPIRE代理暴露的SDS服务器时应向 Envoy 提供哪些服务身份和 CA 证书。

在此过程中,将轮换服务身份和 CA 证书,并将更新流式传输回 Envoy。Envoy 会立即将它们应用于新连接,不会出现任何中断或停机,也不会让私钥接触文件系统。

App Mesh 如何配置特使进行谈判 TLS

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

使用客户端策略

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

没有客户端策略

如果客户端尚未配置客户端策略,或者客户端策略与服务器的端口不匹配,App Mesh 将使用服务器来确定是否与客户端进行协商TLS,以及如何进行协商。例如,如果虚拟网关未指定客户端策略,并且虚拟节点未配置TLS终止,则代理之间TLS将不会进行协商。如果客户端未指定匹配的客户端策略,并且服务器已配置为TLS模式STRICTPERMISSIVE,则代理将被配置为协商TLS。根据为TLS终止提供证书的方式,将适用以下其他行为。

  • ACM-托管TLS证书 — 当服务器使用托ACM管证书配置TLS终止时,App Mesh 会自动配置客户端,使其TLS与证书链接到的根用户 CA 协商和验证证书。

  • 基于文件的TLS证书 — 当服务器使用来自代理本地文件系统的证书配置TLS终止时,App Mesh 会自动配置客户端进行协商TLS,但服务器的证书未经过验证。

主题备用名称

您可以选择指定要信任的主题备用名称 (SANs) 列表。SANs必须采用FQDN或URI格式。如果提供SANs,Envoy 将验证所提供证书的主题备用名称是否与此列表中的一个名称匹配。

如果您未在终止网格端点SANs上指定,则该节点的 Envoy 代理不会在对等客户端证书SAN上进行验证。如果您未在原始网格端点SANs上指定,则终止端点提供的证书SAN上的必须与网状端点服务发现配置相匹配。

有关更多信息,请参阅 App Mesh TLS:证书要求

重要

只有在的客户端策略设置为TLS时,SANs才能使用通配符。not enforced如果将客户端虚拟节点或虚拟网关的客户端策略配置为强制执行TLS,则它不能接受通配符SAN。

验证加密

启用后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 统计信息的更多信息,请参阅 E nvoy 监听器统计信息

证书续订

AWS Private CA

当您使用续订证书时ACM,续订的证书将在续订完成后的 35 分钟内自动分发给您连接的代理。我们建议使用托管续订来自动续订即将到期的证书。有关更多信息,请参阅《 AWS Certificate Manager 用户指南》中的 “亚马逊颁发ACM的证书” 的托管续订

您自己的证书

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

将 Amazon ECS 工作负载配置为使用TLS身份验证 AWS App Mesh

您可以将网格配置为使用TLS身份验证。确保证书可供您添加到工作负载中的 Envoy 代理 sidecar 使用。你可以将EBS或EFS卷附加到你的 Envoy 边车,也可以从 Secr AWS ets Manager 存储和检索证书。

  • 如果您使用基于文件的证书分发,请将EBS或EFS卷附加到您的 Envoy sidecar。确保证书和私钥的路径与中配置的路径相匹配 AWS App Mesh。

  • 如果你使用的是SDS基于基础的分发,请添加一个实现可访问证书的 Envoy 的 SDS API sidecar。

注意

SPIRE在 Amazon 上不支持ECS。

将 Kubernetes 工作负载配置为使用身份验证 TLS AWS App Mesh

您可以为 Kubernetes 配置 AWS App Mesh 控制器,以启用虚拟节点和虚拟网关服务后端和侦听器的TLS身份验证。确保证书可供您添加到工作负载中的 Envoy 代理 sidecar 使用。您可以在相互TLS身份验证的演练部分中查看每种分发类型的示例。

  • 如果您使用基于文件的证书分发,请将EBS或EFS卷附加到您的 Envoy sidecar。确保证书和私钥的路径与控制器中配置的路径相匹配。或者,您可以使用挂载在文件系统上的 Kubernetes 密钥。

  • 如果你使用的是SDS基于基础的分发,你应该设置一个实现 Envoy 的本地节点SDS提供者SDSAPI。Envoy 会过来的UDS。要在EKS AppMesh 控制器中启用SDS基于 m 的TLS支持,请将该enable-sds标志设置为,true并通过该sds-uds-path标志SDS提供本地提供商到控制器的UDS路径。如果您使用 helm,则可以在控制器安装过程中设置以下内容:

    --set sds.enabled=true
注意

如果您在 Fargate 模式下使用SPIRE亚马逊 Elastic Kubernetes Service(亚马逊),则无法使用来分发证书。EKS