在 Azure 容器应用中使用 TLS/SSL 的自定义域

备注

基本标准计划于 2025 年 3 月 17 日进入退休期。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划于 2024 年 9 月 30 日进入停用期,并将在 2025 年 3 月底之前完全关闭。

本文适用于:✅ 基本/标准

使用 TLS/SSL 将自定义域从 Azure Spring Apps 迁移到 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

若要在客户端和容器化应用之间启用双向 TLS (mTLS),请执行以下步骤:

  1. 使用以下命令以 YAML 格式导出容器应用配置:

    az containerapp show \
        --resource-group "my-resource-group" \
        --name "my-app" \
        --output yaml > app.yaml
    
  2. 更新 app.yamlclientCertificateMode 中的 值,如以下示例所示:

    properties:
      configuration:
        ingress:
          clientCertificateMode: require
    

    你可以将此属性设置为以下值之一:

    • require:对容器应用的所有请求都需要客户端证书。
    • accept:客户端证书是可选的。 如果未提供客户端证书,则仍会接受请求。
    • ignore:客户端证书被忽略。
  3. 使用以下命令将 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>

使用 SSL 捆绑将证书从 Key Vault 加载到信任存储中

使用以下步骤通过 spring-cloud-azure-starter-keyvault-jca 库将证书从 Azure Key Vault 加载到信任库中:

  1. 在 Azure Key Vault 中生成或导入证书。 有关详细信息,请参阅 在 Azure Key Vault 中创建和导入证书

  2. 在容器应用中启用托管标识。 若要在容器应用中启用托管标识,请参阅 Azure 容器应用中的托管标识

  3. Key Vault Certificate User Key Vault 中的托管标识授予角色。 如需了解详情,请参阅单个密钥、机密和证书角色分配的最佳做法

  4. 将以下配置添加到 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
    
  5. 若要应用 Key Vault SSL 捆绑包,请更新 RestTemplateWebClient 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 通信

使用以下步骤为客户端和服务器之间的双向身份验证设置 mTLS:

  1. 生成或导入客户端证书和服务器证书到 Azure Key Vault。 有关详细信息,请参阅 在 Azure Key Vault 中创建和导入证书

  2. 为容器应用启用托管标识。 若要在容器应用中启用托管标识,请参阅 Azure 容器应用中的托管标识

  3. Key Vault Certificate User 两个密钥保管库的托管标识授予角色。 如需了解详情,请参阅单个密钥、机密和证书角色分配的最佳做法

  4. 将以下配置添加到 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
    
  5. 若要应用 Key Vault SSL 捆绑包,请更新 RestTemplateWebClient 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 容器应用,从而跨所有流量类型保持安全高效的通信。