备注
基本标准计划于 2025 年 3 月 17 日进入退休期。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划于 2024 年 9 月 30 日进入停用期,并将在 2025 年 3 月底之前完全关闭。
本文适用于:✅ 基本/标准
使用 TLS/SSL 将自定义域从 Azure Spring Apps 迁移到 Azure 容器应用涉及几个步骤,以确保顺利过渡。 本文将引导你完成此过程,包括客户端流量、应用程序间流量和外部服务的流量。
- 现有的 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。
若要在客户端和容器化应用之间启用双向 TLS (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,例如 http://<app-name>
。 若要保护此流量,可以使用以下命令启用对等加密:
# 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
启用对等加密后,一个容器应用可以使用带有 mTLS 的 HTTPS 访问其他容器应用,例如 https://<app-name>
。 mTLS 中使用的证书为系统分配。
有关详细信息,请参阅 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>
使用以下步骤通过 spring-cloud-azure-starter-keyvault-jca
库将证书从 Azure Key Vault 加载到信任库中:
在 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
或WebClient
bean 配置,如以下示例所示:// 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:
生成或导入客户端证书和服务器证书到 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
或WebClient
bean 配置,如以下示例所示:// 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 容器应用,从而跨所有流量类型保持安全高效的通信。