Transport Layer Security (TLS) - AWS 應用程式網格

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

Transport Layer Security (TLS)

重要

支援終止通知:2026 年 9 月 30 日, AWS 將停止支援 AWS App Mesh。2026 年 9 月 30 日之後,您將無法再存取 AWS App Mesh 主控台或 AWS App Mesh 資源。如需詳細資訊,請參閱此部落格文章從 遷移 AWS App Mesh 至 Amazon ECS Service Connect

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

App Mesh 可讓您以下列方式提供 TLS 憑證給代理:

  • 來自 AWS Certificate Manager (ACM) 的私有憑證,由 AWS Private Certificate Authority () 發行AWS Private CA。

  • 儲存在虛擬節點本機檔案系統中的憑證,由您自己的憑證授權機構 (CA) 發行

  • Secrets Discovery Service (SDS) 端點透過本機 Unix Domain Socket 提供的憑證。

Envoy Proxy 授權 必須針對網格端點代表的已部署 Envoy 代理啟用 。我們建議您在啟用代理授權時,只限制存取您要啟用加密的網格端點。

憑證需求

憑證上的其中一個主體別名 (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 身分驗證憑證

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

AWS Private CA

憑證必須存放在與將使用憑證的網格端點相同的區域和 AWS 帳戶中的 ACM 中。CA 的憑證不需要位於相同的 AWS 帳戶中,但它仍然需要位於與網格端點相同的 區域。如果您沒有 AWS 私有 CA,則必須先建立一個 ,才能從中請求憑證。如需 AWS Private CA 使用 ACM 從現有 請求憑證的詳細資訊,請參閱請求私有憑證。憑證不能是公有憑證。

您用於 TLS 用戶端政策的私有 CAs 必須是根使用者 CAs。

若要設定具有憑證和 CAs虛擬節點 AWS Private CA,您用來呼叫 App Mesh 的主體 (例如使用者或角色) 必須具有下列 IAM 許可:

  • 對於您新增至接聽程式 TLS 組態的任何憑證,主體必須擁有 acm:DescribeCertificate許可。

  • 對於在 TLS 用戶端政策上設定的任何 CAs,委託人必須擁有 acm-pca:DescribeCertificateAuthority許可。

重要

與其他帳戶共用 CAs可能會將這些帳戶意外的權限授予 CA。我們建議使用資源型政策,針對不需要從 CA 發行憑證acm-pca:GetCertificateAuthorityCertificate的帳戶,限制存取 acm-pca:DescribeCertificateAuthority和 。

您可以將這些許可新增至連接至委託人的現有 IAM 政策,或建立新的委託人和政策,並將政策連接至委託人。如需詳細資訊,請參閱編輯 IAM 政策建立 IAM 政策和新增 IAM 身分許可

注意

您需支付每個 操作的每月費用, AWS Private CA 直到您刪除為止。您還需要為每月發行的私有憑證和匯出的私有憑證付費。如需詳細資訊,請參閱AWS Certificate Manager 定價

當您為網格端點代表的 Envoy Proxy 啟用代理授權時,您必須為所使用的 IAM 角色指派下列 IAM 許可:

  • 對於在虛擬節點接聽程式上設定的任何憑證,角色必須具有 acm:ExportCertificate許可。

  • 對於在 TLS 用戶端政策上設定的任何 CAs,角色必須具有 acm-pca:GetCertificateAuthorityCertificate許可。

檔案系統

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

Envoy 的秘密探索服務 (SDS)

Envoy 透過 Secrets 探索通訊協定,從特定端點擷取 TLS 憑證等秘密。如需此通訊協定的詳細資訊,請參閱 Envoy 的 SDS 文件

當 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 Runtime Environment (SPIRE) 整合

您可以使用 SDS API 的任何附屬實作,包括現有工具鏈,例如 SPIFFE Runtime Environment (SPIRE)。SPIRE 旨在啟用分散式系統中多個工作負載之間的相互 TLS 身分驗證部署。它會在執行時間證明工作負載的身分。SPIRE 也會將特定工作負載、短期和自動輪換金鑰和憑證直接交付至工作負載。

您應該將 SPIRE Agent 設定為 Envoy 的 SDS 供應商。允許它為 Envoy 直接提供其提供相互 TLS 身分驗證所需的金鑰材料。在 Envoy 代理旁的附屬項目中執行 SPIRE Agents。客服人員會視需要負責重新產生短期金鑰和憑證。客服人員會證明 Envoy,並判斷當 Envoy 連線到 SPIRE 代理程式公開的 SDS 伺服器時,應提供給 Envoy 哪些服務身分和 CA 憑證。

在此過程中,服務身分和 CA 憑證會輪換,並將更新串流回 Envoy。Envoy 會立即將它們套用至新的連線,而不會中斷或停機,也不會讓私有金鑰接觸檔案系統。

App Mesh 如何設定 Envoys 來交涉 TLS

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

使用用戶端政策

當用戶端政策強制執行 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 會驗證所出示憑證的主體別名是否符合此清單上的其中一個名稱。

如果您未在終止網格端點上指定 SAN,則該節點的 Envoy 代理不會在對等用戶端憑證上驗證 SAN。如果您未在原始網格端點上指定 SAN,則終止端點提供的憑證上的 SAN 必須與網格端點服務探索組態相符。

如需詳細資訊,請參閱應用程式網格 TLS:憑證需求

重要

只有在 TLS 的用戶端政策設定為 時,才能使用萬用字元 SANsnot enforced。如果用戶端虛擬節點或虛擬閘道的用戶端政策設定為強制執行 TLS,則無法接受萬用字元 SAN。

驗證加密

啟用 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 Listener Statistics

憑證續約

AWS Private CA

當您使用 ACM 續約憑證時,續約的憑證會在續約完成後的 35 分鐘內自動分發到連線的代理。我們建議您使用 受管續約,在接近其有效期結束時自動續約憑證。如需詳細資訊,請參閱 AWS Certificate Manager 《 使用者指南》中的 ACM Amazon 發行憑證的受管續約

您自己的憑證

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

設定 Amazon ECS 工作負載以搭配 使用 TLS 身分驗證 AWS App Mesh

您可以設定您的網格以使用 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

您可以設定 Kubernetes 的 AWS App Mesh 控制器,為虛擬節點和虛擬閘道服務後端和接聽程式啟用 TLS 身分驗證。確定憑證可供您新增至工作負載的 Envoy 代理附屬項目使用。您可以在相互 TLS 身分驗證的逐步解說區段中查看每個分佈類型的範例。

  • 如果您使用以檔案為基礎的憑證分佈,請將 EBS 或 EFS 磁碟區連接至您的 Envoy 附屬項目。確定憑證和私有金鑰的路徑符合控制器中設定的路徑。或者,您可以使用掛載在檔案系統的 Kubernetes Secret。

  • 如果您使用的是 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 來分發憑證。