你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
注意
基本计划、标准计划和企业计划于 2025 年 3 月 17 日进入停用期。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划于 2024 年 9 月 30 日进入停用期,并将在 2025 年 3 月底之前完全关闭。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用。
本文适用于:✅基本计划/标准计划 ✅ 企业计划
使用 TLS/SSL 将自定义域从 Azure Spring Apps 迁移到 Azure 容器应用涉及几个步骤,以确保顺利过渡。 本文将引导你完成此过程,包括客户端流量、应用程序间流量和外部服务的流量。
Prerequisites
- 现有的 Azure 容器应用。 更多信息,请参阅快速入门:使用 Azure 门户部署你的第一个应用程序。
- Azure CLI。
- 现有的 TLS/SSL 证书 - 例如,存储在 Azure KeyVault 中的证书。
- (可选)如果要从 Azure 存储文件共享将证书加载到信任存储中,则需要一个现有的 Azure 存储帐户。 有关详细信息,请参阅创建 Azure 存储帐户。
流向应用程序的客户端流量
默认情况下,除非手动启用 HTTP 流量,否则容器应用中的所有入站流量均使用 HTTPS,可以使用以下命令执行此操作:
az containerapp ingress update \
--resource-group "my-resource-group" \
--name "my-app" \
--allow-insecure
有关为应用配置入口的详细信息,请参阅在 Azure 容器应用中为应用配置入口。
自定义域
若要保护 Azure 容器应用中的自定义域名系统 (DNS) 名称,你可以添加数字安全证书。 该证书支持应用之间的安全通信。
如果需要保护 Azure 容器应用中的自定义域,你可以使用免费且易于使用的专用证书。 有关详细信息,请参阅 Azure 容器应用中的自定义域名和免费托管证书。
如果本地存储了专用证书,可以将其上传。 有关详细信息,请参阅 Azure 容器应用中的自定义域名和自带证书。
如果证书来自 Azure Key Vault,可以直接将证书导入 Azure 容器应用。 有关详细信息,请参阅 将证书从 Azure Key Vault 导入到 Azure 容器应用。
如果要继续使用 Azure Spring Apps 中的原始证书和域名,可以将证书上传到容器应用或 Azure 密钥保管库。 此外,你还可以更新 DNS 提供程序中的 A 记录或 CNAME,以将原始域名重定向到容器应用 IP 或 URL。
在客户端和容器应用之间启用 mTLS
若要在客户端和容器应用之间启用相互 (mTLS),请执行以下步骤:
使用以下命令以 YAML 格式导出容器应用配置:
az containerapp show \ --resource-group "my-resource-group" \ --name "my-app" \ --output yaml > app.yaml更新 app.yaml
clientCertificateMode中的 值,如以下示例所示:properties: configuration: ingress: clientCertificateMode: require你可以将此属性设置为以下值之一:
-
require:对容器应用的所有请求都需要客户端证书。 -
accept:客户端证书是可选的。 如果未提供客户端证书,则仍会接受请求。 -
ignore:忽略客户端证书。
-
使用以下命令将
clientCertificateMode更改应用到容器应用:az containerapp update \ --resource-group "my-resource-group" \ --name "my-app" \ --yaml app.yaml
有关详细信息,请参阅在 Azure 容器应用中配置客户端证书身份验证。
你需要在代码中处理客户端证书验证。
应用程序间流量
默认情况下,同一环境中的容器应用之间的流量使用 HTTP。 若要保护此流量,请使用以下命令启用对等加密:
# enable when creating the container app
az containerapp env create \
--resource-group "my-resource-group" \
--name "my-app" \
--location "location" \
--enable-peer-to-peer-encryption
# enable for the existing container app
az containerapp env update \
--resource-group "my-resource-group" \
--name "my-app" \
--enable-peer-to-peer-encryption
启用后,Azure 容器应用通过其内置的透明代理功能自动保护 HTTP 流量。 应用程序通常不需要注意流量是否已加密。
如果要在内部使用 HTTPS 在应用之间进行通信,则必须处理证书验证。 这是因为域名可能与证书的公用名(CN)或使用者可选名称(SAN)不匹配。
有关详细信息,请参阅 Azure 容器应用环境中配置入口的对等加密部分。
流向外部服务的流量
此示例演示如何使用 spring-cloud-azure-starter-keyvault-jca 库从 Azure Key Vault 加载证书,为流向外部服务的流量启用 TLS 和 mTLS。 Java 项目必须使用 Spring Boot 3.1+ 并在 pom.xml 文件中包含以下依赖项:
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-keyvault-jca</artifactId>
<version>5.23.0</version>
</dependency>
使用 SSL 捆绑将证书从 Key Vault 加载到信任存储中
使用以下步骤从 Azure Key Vault 中使用 spring-cloud-azure-starter-keyvault-jca 库将证书加载到信任库中:
在 Azure Key Vault 中生成或导入证书。 有关详细信息,请参阅 在 Azure Key Vault 中创建和导入证书。
在您的容器应用中启用托管身份。 若要在容器应用中启用托管标识,请参阅 Azure 容器应用中的托管标识。
将
Key Vault Certificate User角色授予 Key Vault 中的托管标识。 如需了解详情,请参阅单个密钥、机密和证书角色分配的最佳做法。将以下配置添加到 application.yml 文件:
spring: ssl: bundle: keyvault: tlsClientBundle: truststore: keyvault-ref: keyvault1 cloud: azure: keyvault: jca: vaults: keyvault1: endpoint: ${KEY_VAULT_SSL_BUNDLES_KEYVAULT_URI_01} credential: client-id: ${KEY_VAULT_SSL_BUNDLES_CLIENT_ID} # Required for user-assigned managed identity managed-identity-enabled: true若要应用 Key Vault SSL 捆绑包,请更新
RestTemplate或WebClientbean 配置,如以下示例所示:// For RestTemplate @Bean RestTemplate restTemplateWithTLS(RestTemplateBuilder restTemplateBuilder, SslBundles sslBundles) { return restTemplateBuilder.sslBundle(sslBundles.getBundle("tlsClientBundle")).build(); } // For WebClient @Bean WebClient webClientWithTLS(WebClientSsl ssl) { return WebClient.builder().apply(ssl.fromBundle("tlsClientBundle")).build(); }
启用 mTLS 通信
使用以下步骤为客户端和服务器之间的双向身份验证设置 mTLS:
生成或导入客户端证书和服务器证书到 Azure Key Vault。 有关详细信息,请参阅 在 Azure Key Vault 中创建和导入证书。
为云容器应用启用托管标识。 若要在容器应用中启用托管标识,请参阅 Azure 容器应用中的托管标识。
将
Key Vault Certificate User角色授予该托管标识,以便它能访问这两个密钥保管库。 如需了解详情,请参阅单个密钥、机密和证书角色分配的最佳做法。将以下配置添加到 mTLS 的 application.yml 文件中:
spring: ssl: bundle: keyvault: mtlsClientBundle: key: alias: client for-client-auth: true keystore: keyvault-ref: keyvault2 truststore: keyvault-ref: keyvault1 cloud: azure: keyvault: jca: vaults: keyvault1: endpoint: ${KEY_VAULT_SSL_BUNDLES_KEYVAULT_URI_01} credential: client-id: ${KEY_VAULT_SSL_BUNDLES_CLIENT_ID} # Required for user-assigned managed identity managed-identity-enabled: true keyvault2: endpoint: ${KEY_VAULT_SSL_BUNDLES_KEYVAULT_URI_02} credential: client-id: ${KEY_VAULT_SSL_BUNDLES_CLIENT_ID} # Required for user-assigned managed identity managed-identity-enabled: true若要应用 Key Vault SSL 捆绑包,请更新
RestTemplate或WebClientbean 配置,如以下示例所示:// For RestTemplate @Bean RestTemplate restTemplateWithMTLS(RestTemplateBuilder restTemplateBuilder, SslBundles sslBundles) { return restTemplateBuilder.sslBundle(sslBundles.getBundle("mtlsClientBundle")).build(); } // For WebClient @Bean WebClient webClientWithMTLS(WebClientSsl ssl) { return WebClient.builder().apply(ssl.fromBundle("mtlsClientBundle")).build(); }
有关在 Spring Boot 应用程序中使用 spring-cloud-azure-starter-keyvault-jca 库的详细信息,请参阅 Spring Cloud Azure 初学者密钥保管库 JCA 简介:适用于 Spring Boot 的简化 TLS 和 mTLS。
通过执行这些步骤,可以使用 TLS/SSL 成功将自定义域从 Azure Spring Apps 迁移到 Azure 容器应用,从而跨所有流量类型保持安全高效的通信。