次の方法で共有


Azure Container Apps での TLS/SSL を使用したカスタム ドメイン

Note

BasicStandardEnterprise プランは、2025 年 3 月中旬以降非推奨になり、廃止期間は 3 年間です。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の廃止のお知らせ」を参照してください。

Standard 従量課金と専用プランは、2024 年 9 月 30 日以降に非推奨になり、6 か月後に完全にシャットダウンされます。 Azure Container Apps に移行することをお勧めします。 詳細については、「Azure Spring Apps の Standard 従量課金および専用プランを Azure Container Apps に移行する」を参照してください。

この記事の適用対象:✅ Basic/Standard ✅ Enterprise

TLS/SSL を使用したカスタム ドメインを Azure Spring Apps から Azure Container Apps に移行する場合、スムーズな移行を実現するためのいくつかの手順があります。 この記事では、クライアント トラフィック、アプリケーション間トラフィック、外部サービスへのトラフィックに関するプロセスについて説明します。

前提条件

アプリケーションへのクライアント トラフィック

既定では、HTTP トラフィックを手動で有効にしない限り、コンテナー アプリ内のすべての受信トラフィックは HTTPS を使用します。これは、次のコマンドを使用して行うことができます。

az containerapp ingress update \
    --resource-group "my-resource-group" \
    --name "my-app" \
    --allow-insecure

アプリのイングレス構成の詳細については、「Azure Container Apps でアプリのイングレスを構成する」を参照してください。

カスタム ドメイン

Azure Container Apps でカスタム ドメイン ネーム システム (DNS) 名をセキュリティで保護するには、デジタル セキュリティ証明書を追加できます。 これにより、アプリ間でセキュリティで保護された通信がサポートされます。

Azure Container Apps でカスタム ドメインをセキュリティで保護する必要がある場合は、使いやすい無料のプライベート証明書を使用できます。 詳細については、「Azure Container Apps のカスタム ドメイン名と無料のマネージド証明書」を参照してください。

プライベート証明書がローカルに保存されている場合は、それをアップロードできます。 詳細については、「Azure Container Apps のカスタム ドメイン名と独自の証明書の持ち込み」を参照してください。

証明書が Azure Key Vault からの証明書の場合は、詳細について、「Azure Key Vault から Azure Container Apps に証明書をインポートする」を参照してください。

Azure Spring Apps の元の証明書とドメイン名を引き続き使用する場合は、コンテナー アプリまたは Azure Key Vault に証明書をアップロードできます。 また、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 Container Apps でクライアント証明書の認証を構成する」を参照してください。

コードでクライアント証明書の検証を処理する必要があります。

アプリケーション間トラフィック

同じアプリ環境内の異なるコンテナー アプリ間のトラフィックでは、既定で 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

ピアツーピア暗号化を有効にすると、1 つのコンテナー アプリは、mTLS の HTTPS を使用して他のコンテナー アプリにアクセスできます (たとえば https://<app-name>)。 mTLS で使用される証明書はシステム割り当てです。

詳細については、「Azure Container Apps 環境でのネットワーク」のピアツーピア暗号化に関するセクションを参照してください。

外部サービスへのトラフィック

Key Vault から証明書を参照し、ボリュームに証明書をマウントする

証明書を定義するときは、Azure Key Vault に格納されている証明書への参照を作成します。 Azure Container Apps は証明書の値を Key Vault から自動的に取得し、コンテナー アプリのシークレットとして使用できるようにします。

Key Vault から証明書を参照するには、まずコンテナー アプリでマネージド ID を有効にし、ID に Key Vault シークレットへのアクセス権を付与する必要があります。

コンテナー アプリでマネージド ID を有効にするには、「Azure Container Apps のマネージド ID」を参照してください。

Key Vault 証明書へのアクセスを許可するには、作成したマネージド ID に対するロールの割り当て Key Vault Secrets User を Key Vault に追加します。 詳細については、「個々のキー、シークレット、証明書のロールの割り当てのベスト プラクティス」を参照してください。

コンテナー アプリを作成する場合、証明書は --secrets パラメーターと次のガイドラインを使用して定義されます。

  • このパラメーターには、スペースで区切った一連の名前と値のペアを指定します。
  • 各ペアを区切るには、等号 (=) を使います。
  • Key Vault の参照を指定するには、<certificate-name>=keyvaultref:<key-vault-secret-identifier-of-certificate>,identityref:<managed-identity-ID> という形式を使います。 たとえば、my-cert=keyvaultref:https://mykeyvault.vault.azure.net/secrets/mycert,identityref:/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/my-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/my-identity のようにします。

次のコマンドは例を示しています。

az containerapp create \
    --resource-group "my-resource-group" \
    --name "my-app" \
    --environment "my-environment-name" \
    --image <image_name> \
    --user-assigned "<user-assigned-identity-ID>" \
    --secrets "my-cert=keyvaultref:<key-vault-secret-identifier-of-certificate>,identityref:<user-assigned-identity-ID>"
    --secret-volume-mount "/mnt/cert"

ここでは、--secrets パラメーターで証明書が宣言されています。 <key-vault-secret-identifier-of-certificate> を Key Vault 内の証明書のシークレット識別子 URI に置き換えます。 <user-assigned-identity-ID> をユーザー割り当て ID のリソース ID に置き換えます。 システム割り当て ID の場合、リソース ID ではなく system を使います。 ボリュームにマウントされた証明書の名前は my-cert になり、種類はシークレットです。 このボリュームはパス /mnt/cert にマウントされます。これで、アプリケーションはボリューム マウントのファイルとしてシークレットを読み取ることができるようになります。

既存のコンテナー アプリの場合は、次のコマンドを使用して Key Vault からシークレットを参照し、ボリュームにマウントできます。

az containerapp secret set \
    --resource-group "my-resource-group" \
    --name "my-app" \
    --secrets "my-cert=keyvaultref:<key-vault-secret-identifier-of-certificate>,identityref:<user-assigned-identity-ID>"

az containerapp update \
    --resource-group "my-resource-group" \
    --name "my-app" \
    --secret-volume-mount "/mnt/cert"

コードから証明書を読み込む

読み込まれた証明書は、定義済みのマウントされたパス (たとえば /mnt/cert/my-cert) で使用できます。次の Java コードを使用して、Azure Container Apps のアプリケーションに証明書を読み込みます。

証明書はシークレットとしてマウントされるため、そのコンテンツは Base64 でエンコードされます。結果として、使用する前にデコードが必要になる場合があります。

try {
  byte[] encodedBytes = Files.readAllBytes(Paths.get("/mnt/cert/my-cert"));
  PKCS12PfxPdu pfx = new PKCS12PfxPdu(Base64.getDecoder().decode(encodedBytes));
  List<Certificate> certificates = new ArrayList<>();
  for (ContentInfo contentInfo : pfx.getContentInfos()) {
    if (contentInfo.getContentType().equals(PKCSObjectIdentifiers.encryptedData)) {
      PKCS12SafeBagFactory safeBagFactory = new PKCS12SafeBagFactory(contentInfo,
        new JcePKCSPBEInputDecryptorProviderBuilder().build("\0".toCharArray()));
      PKCS12SafeBag[] safeBags = safeBagFactory.getSafeBags();
      for (PKCS12SafeBag safeBag : safeBags) {
        Object bagValue = safeBag.getBagValue();
        if (bagValue instanceof X509CertificateHolder) {
          CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
          InputStream in = new ByteArrayInputStream(((X509CertificateHolder) bagValue).getEncoded());
          certificates.add(certFactory.generateCertificate(in));
        }
      }
    }
  }

  // use the loaded certificate in 'certificates'
} catch (PKCSException | CertificateException | IOException e) {
  // handle exception
}

このサンプル コードでは、org.bouncycastle.bcpkix-lts8on をプロジェクトにインポートして証明書データを解析する必要があります。

証明書を信頼ストアに読み込む

証明書を読み込むには、次の手順に従います。

  1. ストレージ アカウント (たとえば /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/my-resource-group/providers/Microsoft.Storage/storageAccounts/mystorageaccount) を設定します。

  2. JCA ライブラリをダウンロードしてアップロードします。 Maven リポジトリ azure-security-keyvault-jca から最新バージョンの JCA ライブラリを取得し、JAR ファイルをストレージ アカウント内のファイル共有 (たとえば /jca/lib/azure-security-keyvault-jca.jar) にアップロードします。

  3. Java セキュリティ構成を変更してアップロードするには、次の手順に従います。

    1. JDK の java.security ファイルのコピーを作成します。 Java バージョン 8 以前の場合、java.security ファイルは $JAVA_HOME/jre/lib/security/java.security にあります。 Java バージョン 11 以降の場合、java.security ファイルは $JAVA_HOME/conf/security にあります。

    2. ファイル内で security.provider.<#>= プロパティを見つけて、次の行を追加します。

      security.provider.<#>=com.azure.security.keyvault.jca.KeyVaultJcaProvider
      

      この行では、数値記号プレースホルダー <#> は、リスト内の最後の数値の 1 単位上の増分を表します (たとえば security.provider.14)。

    3. 変更した java.security ファイルをストレージ アカウント内のファイル共有 (たとえば /jca/security/java.security) にアップロードします。

  4. 信頼ストアに読み込む必要がある証明書を、ストレージ アカウントのファイル共有 (たとえば /jca/truststore/) にアップロードします。

  5. ボリューム マウントを追加します。 JCA ライブラリと証明書のボリューム マウントをコンテナー アプリに追加するには、「チュートリアル: Azure Container Apps で Azure Files ボリューム マウントを作成する」を参照してください。 たとえば、/mnt/jca/ としてマウントできます。

  6. JCA 関連のパラメーターを使用してイメージを更新します。 次の例に示すように、Dockerfile を変更します。

    # filename: JAR.dockerfile
    
    FROM mcr.microsoft.com/openjdk/jdk:17-mariner
    
    ARG JAR_FILENAME
    
    COPY $JAR_FILENAME /opt/app/app.jar
    ENTRYPOINT ["java", "-Dsecurity.overridePropertiesFile=true", "-Djava.security.properties=/mnt/jca/security/java.security", \
        "--module-path", "/mnt/jca/lib", "--add-modules=com.azure.security.keyvault.jca", "-Djavax.net.ssl.trustStoreType=AzureKeyVault", \
        "-Dazure.cert-path.custom=/mnt/jca/truststore/", "-jar", "/opt/app/app.jar"]
    
  7. 次のコマンドを使用してイメージを再構築し、コンテナー レジストリにアップロードします。

    docker build -t <image-name>:<image-tag> \
        -f JAR.dockerfile \
        --build-arg JAR_FILENAME=<path-to-jar> \
        .
    
  8. コンテナー アプリを作成または更新します。 詳細については、クイックスタート: Azure portal を使用して最初のコンテナー アプリをデプロイする を参照してください。

Java アプリケーションで Azure Key Vault 用 JCA プロバイダーを使用する方法の詳細については、JCA プロバイダーの例を参照してください。

この方法では、Azure Spring Apps の動作との整合性が維持されます。 他の方法を使用して、信頼ストアに証明書を読み込むこともできます。

これらの手順に従うことで、TLS/SSL を使用したカスタム ドメインを Azure Spring Apps から Azure Container Apps に正常に移行し、すべてのトラフィックの種類にわたってセキュリティで保護された効率的な通信を維持できます。