

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Transport Layer Security (TLS)
<a name="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)。

在 App Mesh 中，Transport Layer Security (TLS) 會加密部署在運算資源上的 Envoy 代理程式之間的通訊，這些資源由網格端點在 App Mesh 中表示，例如 [虛擬節點](virtual_nodes.md)和 [虛擬閘道](virtual_gateways.md)。代理會交涉和終止 TLS。使用 應用程式部署代理時，您的應用程式程式碼不負責交涉 TLS 工作階段。代理會代表您的應用程式交涉 TLS。

App Mesh 可讓您以下列方式提供 TLS 憑證給代理：
+ 來自 AWS Certificate Manager (ACM) 的私有憑證，由 AWS 私有憑證授權單位 () 發行AWS 私有 CA。
+ 儲存在您自有憑證授權機構 (CA) 發行之虛擬節點本機檔案系統中的憑證 
+ Secrets Discovery Service (SDS) 端點透過本機 Unix Domain Socket 提供的憑證。

[Envoy Proxy 授權](proxy-authorization.md) 必須針對網格端點表示的已部署 Envoy 代理啟用 。我們建議您在啟用代理授權時，將存取權限制為您啟用加密的網格端點。

## 憑證需求
<a name="virtual-node-tls-prerequisites"></a>

憑證上的其中一個主體別名 (SANs) 必須符合特定條件，視網格端點所代表的實際服務探索方式而定。
+ **DNS** – 其中一個憑證 SANs 必須符合 DNS 服務探索設定中提供的值。對於具有服務探索名稱 的應用程式`{{mesh-endpoint.apps.local}}`，您可以建立與該名稱相符的憑證，或使用萬用字元 的憑證`*.{{apps.local}}`。
+ **AWS Cloud Map** – 其中一個憑證 SANs 必須符合使用 格式 AWS Cloud Map 的服務探索設定中提供的值`{{service-name.namespace-name}}`。對於具有 serviceName AWS Cloud Map 的服務探索設定`{{mesh-endpoint}}`和 namespaceName 的應用程式`{{apps.local}}`，您可以建立與名稱 相符的憑證`{{mesh-endpoint.apps.local}}`，或使用萬用字元的憑證 `*.{{apps.local}}.`

對於這兩種探索機制，如果憑證 SANs都不符合 DNS 服務探索設定，Envoys 之間的連線會失敗並顯示下列錯誤訊息，如用戶端 Envoy 所示。

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

## TLS 身分驗證憑證
<a name="authentication-certificates"></a>

使用 TLS 身分驗證時，App Mesh 支援憑證的多個來源。

**AWS 私有 CA**  
憑證必須存放在與將使用憑證的網格端點相同的區域和 AWS 帳戶中的 ACM 中。CA 的憑證不需要位於相同的 AWS 帳戶中，但仍需要位於與網格端點相同的區域。如果您沒有 AWS 私有 CA，則必須先[建立一個](https://docs.aws.amazon.com/acm-pca/latest/userguide/PcaCreateCa.html)，才能從中請求憑證。如需 AWS 私有 CA 使用 ACM 從現有 請求憑證的詳細資訊，請參閱[請求私有憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-private.html)。憑證不能是公有憑證。  
您用於 TLS 用戶端政策的私有 CAs 必須是根使用者 CAs。  
若要設定具有憑證和 CAs虛擬節點 AWS 私有 CA，您用來呼叫 App Mesh 的委託人 （例如使用者或角色） 必須具有下列 IAM 許可：  
+ 對於您新增至接聽程式 TLS 組態的任何憑證，委託人必須擁有 `acm:DescribeCertificate`許可。
+ 對於在 TLS 用戶端政策上設定的任何 CAs，委託人必須擁有 `acm-pca:DescribeCertificateAuthority`許可。
與其他帳戶共用 CAs可能會將這些帳戶意外的權限授予 CA。對於不需要從 CA 發行憑證`acm-pca:GetCertificateAuthorityCertificate`的帳戶，我們建議您使用資源型政策來限制存取 `acm-pca:DescribeCertificateAuthority`和 。
您可以將這些許可新增至連接至委託人的現有 IAM 政策，或建立新的委託人和政策，並將政策連接至委託人。如需詳細資訊，請參閱[編輯 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-edit.html)、[建立 IAM 政策和](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)[新增 IAM 身分許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console)。  
您需要支付每個 操作的每月費用， AWS 私有 CA 直到您將其刪除為止。您還需要為每月發行的私有憑證和匯出的私有憑證付費。如需詳細資訊，請參閱[AWS Certificate Manager 定價](https://aws.amazon.com//certificate-manager/pricing/)。
當您為網格端點代表的 Envoy Proxy 啟用代理[授權](proxy-authorization.md)時，您必須指派您使用的 IAM 角色下列 IAM 許可：  
+ 對於在虛擬節點接聽程式上設定的任何憑證，角色必須具有 `acm:ExportCertificate`許可。
+ 對於在 TLS 用戶端政策上設定的任何 CAs，角色必須具有 `acm-pca:GetCertificateAuthorityCertificate`許可。

**檔案系統**  
您可以使用 檔案系統將憑證分發給 Envoy。您可以透過在檔案路徑上提供憑證鏈和對應的私有金鑰來執行此操作。如此一來，即可從 Envoy 附屬代理存取這些資源。

**Envoy 的秘密探索服務 (SDS)**  
Envoy 透過 Secrets Discovery 通訊協定，從特定端點擷取 TLS 憑證等秘密。如需此通訊協定的詳細資訊，請參閱 Envoy 的 [SDS 文件](https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret)。  
當 SDS 做為憑證和憑證鏈的來源時，App Mesh 會將 Envoy 代理設定為使用代理本機的 Unix Domain Socket 做為 Secret Discovery Service (SDS) 端點。您可以使用 `APPMESH_SDS_SOCKET_PATH`環境變數來設定此端點的路徑。  
App Mesh Envoy 代理版本 1.15.1.0 及更新版本支援使用 Unix Domain Socket 的 Local Secrets Discovery Service。  
App Mesh 支援使用 gRPC 的 V2 SDS 通訊協定。

**與 SPIFFE 執行期環境 (SPIRE) 整合**  
您可以使用 SDS API 的任何附屬實作，包括 [SPIFFE 執行期環境 (SPIRE) ](https://github.com/spiffe/spire)等現有工具鏈。SPIRE 旨在啟用分散式系統中多個工作負載之間的交互 TLS 身分驗證部署。它會在執行時間證明工作負載的身分。SPIRE 也會將特定工作負載、短期和自動輪換金鑰和憑證直接交付至工作負載。  
您應該將 SPIRE Agent 設定為 Envoy 的 SDS 供應商。允許它直接為 Envoy 提供提供相互 TLS 身分驗證所需的金鑰材料。在 Envoy 代理旁邊的附屬中執行 SPIRE 代理程式。代理程式會視需要負責重新產生短期金鑰和憑證。代理程式會證明 Envoy，並判斷當 Envoy 連線到 SPIRE 代理程式公開的 SDS 伺服器時，應提供給 Envoy 哪些服務身分和 CA 憑證。  
在此過程中，會輪換服務身分和 CA 憑證，並將更新串流回 Envoy。Envoy 會立即將它們套用至新的連線，而不會中斷或停機，也不會讓私有金鑰接觸檔案系統。

## App Mesh 如何設定 Envoy 來交涉 TLS
<a name="envoy-configuration-tls"></a>

App Mesh 在決定如何在網格中設定 Envoys 之間的通訊時，同時使用用戶端和伺服器的網格端點組態。

**使用用戶端政策**  
當用戶端政策強制執行 TLS 的使用，且用戶端政策中的其中一個連接埠符合伺服器政策的連接埠時，用戶端政策會用來設定用戶端的 TLS 驗證內容。例如，如果虛擬閘道的用戶端政策符合虛擬節點的伺服器政策，則會使用虛擬閘道用戶端政策中定義的設定，在代理之間嘗試 TLS 交涉。如果用戶端政策不符合伺服器政策的連接埠，則根據伺服器政策的 TLS 設定，代理之間的 TLS 可能會也可能不會交涉。

**沒有用戶端政策**  
如果用戶端尚未設定用戶端政策，或用戶端政策不符合伺服器的連接埠，App Mesh 將使用伺服器來判斷是否要從用戶端交涉 TLS，以及如何進行交涉。例如，如果虛擬閘道尚未指定用戶端政策，且虛擬節點尚未設定 TLS 終止，則不會在代理之間交涉 TLS。如果用戶端未指定相符的用戶端政策，且伺服器已設定為 TLS 模式`STRICT`或 `PERMISSIVE`，則代理會設定為交涉 TLS。根據為 TLS 終止提供憑證的方式，適用下列額外行為。  
+ **ACM 受管 TLS 憑證** – 當伺服器已使用 ACM 受管憑證設定 TLS 終止時，App Mesh 會自動設定用戶端以交涉 TLS，並根據憑證鏈結所在的根使用者 CA 來驗證憑證。
+ **以檔案為基礎的 TLS 憑證** – 當伺服器已使用代理本機檔案系統的憑證設定 TLS 終止時，App Mesh 會自動設定用戶端來交涉 TLS，但不會驗證伺服器的憑證。

**主體替代名稱**  
您可以選擇性地指定要信任的主體別名 (SANs清單。SANs必須為 FQDN 或 URI 格式。如果提供 SANs，Envoy 會驗證所出示憑證的主體別名是否符合此清單上的其中一個名稱。  
如果您未在終止網格端點上指定 SAN，則該節點的 Envoy 代理不會在對等用戶端憑證上驗證 SAN。如果您未在原始網格端點上指定 SAN，則終止端點提供的憑證上的 SAN 必須與網格端點服務探索組態相符。  
如需詳細資訊，請參閱 App Mesh [TLS：憑證需求](https://docs.aws.amazon.com/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 交握次數統計資料。`{{my-mesh-endpoint}}` 使用以下命令判斷名為 的網格端點有多少成功 TLS 交握。

```
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>

**AWS 私有 CA**  
當您使用 ACM 續約憑證時，續約的憑證會在續約完成後的 35 分鐘內自動分發給您連接的代理。我們建議您使用 受管續約，在接近有效期間結束時自動續約憑證。如需詳細資訊，請參閱 AWS Certificate Manager 《 使用者指南》中的 [ACM Amazon 發行憑證的受管續約](https://docs.aws.amazon.com/acm/latest/userguide/managed-renewal.html)。

**您自己的憑證**  
從本機檔案系統使用憑證時，Envoy 不會在憑證變更時自動重新載入憑證。您可以重新啟動或重新部署 Envoy 程序，以載入新的憑證。您也可以將較新的憑證放在不同的檔案路徑，並使用該檔案路徑更新虛擬節點或閘道組態。

## 設定 Amazon ECS 工作負載以搭配 使用 TLS 身分驗證 AWS App Mesh
<a name="mtls-configure-ecs"></a>

您可以設定您的網格以使用 TLS 身分驗證。確定憑證可供您新增至工作負載的 Envoy 代理附屬項目使用。您可以將 EBS 或 EFS 磁碟區連接到 Envoy 附屬，也可以從 AWS Secrets Manager 存放和擷取憑證。
+ 如果您使用以檔案為基礎的憑證分佈，請將 EBS 或 EFS 磁碟區連接至您的 Envoy 附屬。確定憑證和私有金鑰的路徑符合其中設定的路徑 AWS App Mesh。
+ 如果您使用的是 SDS 型分佈，請新增可實作 Envoy 的 SDS API 並存取憑證的附屬項目。

**注意**  
Amazon ECS 不支援 SPIRE。

## 設定 Kubernetes 工作負載以搭配 使用 TLS 身分驗證 AWS App Mesh
<a name="mtls-configure-kubernetes"></a>

您可以設定 Kubernetes 的 AWS App Mesh 控制器，為虛擬節點和虛擬閘道服務後端和接聽程式啟用 TLS 身分驗證。請確定憑證可供您新增至工作負載的 Envoy 代理附屬項目使用。您可以在相互 TLS 身分驗證的[逐步解說](https://docs.aws.amazon.com/app-mesh/latest/userguide/mutual-tls.html#mtls-walkthrough)區段中查看每個分發類型的範例。
+ 如果您使用以檔案為基礎的憑證分佈，請將 EBS 或 EFS 磁碟區連接至您的 Envoy 附屬。確定憑證和私有金鑰的路徑符合控制器中設定的路徑。或者，您可以使用掛載在檔案系統的 Kubernetes 秘密。
+ 如果您使用的是 SDS 型分佈，您應該設定節點本機 SDS 供應商，以實作 Envoy 的 SDS API。Envoy 將透過 UDS 連接它。若要在 EKS AppMesh 控制器中啟用 SDS 型 mTLS 支援，請將 `enable-sds`旗標設定為 ，`true`並透過 `sds-uds-path`旗標將本機 SDS 提供者的 UDS 路徑提供給控制器。如果您使用 helm，您可以將這些設定為控制器安裝的一部分：

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

**注意**  
如果您在 Fargate 模式下使用 Amazon Elastic Kubernetes Service (Amazon EKS)，您將無法使用 SPIRE 來分發憑證。