アプリケーション コードでは、 Azure App Service に追加するパブリック証明書またはプライベート証明書にアクセスできます。 アプリ コードがクライアントとして機能し、証明書認証を必要とする外部サービスにアクセスする場合があります。 また、暗号化タスクの実行が必要になる場合もあります。 この記事では、アプリケーション コードでパブリック証明書またはプライベート証明書を使用する方法について説明します。
コードで証明書を使用するこの方法では、App Service のトランスポート層セキュリティ (TLS) 機能を使用します。そのためには、アプリが Basic レベル以上である必要があります。 アプリが Free レベルまたは Shared レベルの場合は、 アプリ リポジトリに証明書ファイルを含めることができます。
App Service で TLS/Secure Sockets Layer (SSL) 証明書を管理できるようにすると、証明書とアプリケーション コードを個別に維持し、機密データを保護できます。
[前提条件]
この記事に従うには、以下を参照してください。
拇印を見つける
Azure portal の左側のウィンドウで、App Services><app-name> を選択します。
アプリの左側のウィンドウで、[証明書] を選択 します。 次に、[ Bring your own certificates (.pfx)] または [公開キー証明書 (.cer)] を選択します。
使用する証明書を見つけて、拇印をコピーします。
証明書をアクセシビリティ対応にする
アプリ コードで証明書にアクセスするには、その拇印を WEBSITE_LOAD_CERTIFICATES
アプリ設定に追加します。
Azure Cloud Shell で次のコマンドを実行します。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>
すべての証明書にアクセスできるようにするには、値を *
に設定します。
WEBSITE_LOAD_CERTIFICATES
を *
に設定すると、以前に追加されたすべての証明書にアプリケーション コードからアクセスできます。 後でアプリに証明書を追加する場合は、アプリを再起動して、アプリから新しい証明書にアクセスできるようにします。 詳細については、証明書を更新または更新するを参照してください。
Windows アプリで証明書を読み込む
WEBSITE_LOAD_CERTIFICATES
アプリの設定では、指定した証明書が Windows 証明書ストアの Windows ホストアプリ (現在のユーザー\マイ) からアクセスできるようになります。
C# コードでは、証明書の拇印を使用して証明書にアクセスします。 次のコードは、拇印 E661583E8FABEF4C0BEF694CBC41C28FB81CD870
を含む証明書を読み込みます。
using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
string certThumbprint = "E661583E8FABEF4C0BEF694CBC41C28FB81CD870";
bool validOnly = false;
using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
// Replace below with your certificate's thumbprint
certThumbprint,
validOnly);
// Get the first cert with the thumbprint
X509Certificate2 cert = certCollection.OfType<X509Certificate2>().FirstOrDefault();
if (cert is null)
throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");
// Use certificate
Console.WriteLine(cert.FriendlyName);
// Consider to call Dispose() on the certificate after it's being used, available in .NET 4.6 and later
}
Java コードでは、Windows-MY
フィールドを使用して、 ストアから証明書にアクセスします。 詳細については、「 公開キー証明書」を参照してください。 次のコードは、秘密キー証明書を読み込む方法を示しています。
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.PrivateKey;
...
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
Certificate cert = ks.getCertificate("<subject-cn>");
PrivateKey privKey = (PrivateKey) ks.getKey("<subject-cn>", ("<password>").toCharArray());
// Use the certificate and key
...
Windows 証明書ストアをサポートしていない、またはサポートが不十分な言語については、「 ファイルから証明書を読み込む」を参照してください。
ファイルから証明書を読み込む
手動でアップロードする証明書ファイルを読み込む必要がある場合は、たとえば、Git ではなく File Transfer Protocol Secure (FTPS) を使用して証明書をアップロードすることをお勧めします。 プライベート証明書などの機密データをソース管理から除外します。
ファイルから証明書を読み込む場合でも、Windows 上の ASP.NET および ASP.NET Core は証明書ストアにアクセスする必要があります。 Windows .NET アプリで証明書ファイルを読み込むには、 Cloud Shell で次のコマンドを使用して現在のユーザー プロファイルを読み込みます。
az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_USER_PROFILE=1
コードで証明書を使用するこの方法では、App Service の TLS 機能を利用します。そのためには、アプリが Basic レベル以上である必要があります。
次の C# の例では、アプリの相対パスからパブリック証明書を読み込みます。
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("~/<relative-path-to-cert-file>");
var cert = new X509Certificate2(bytes);
// Use the loaded certificate
Node.js、PHP、Python、または Java のファイルから TLS/SSL 証明書を読み込む方法については、それぞれの言語または Web プラットフォームのドキュメントを参照してください。
Linux/Windows コンテナーで証明書を読み込む
WEBSITE_LOAD_CERTIFICATES
アプリの設定により、指定した証明書に Windows または Linux カスタム コンテナー (組み込みの Linux コンテナーを含む) がファイルとしてアクセスできるようになります。 ファイルは、次のディレクトリにあります。
コンテナー プラットフォーム | パブリック証明書 | プライベート証明書 |
---|---|---|
Windows コンテナー | C:\appservice\certificates\public |
C:\appservice\certificates\private |
Linux コンテナー | /var/ssl/certs |
/var/ssl/private |
証明書ファイル名は証明書の拇印です。
注
App Service は、 WEBSITE_PRIVATE_CERTS_PATH
、 WEBSITE_INTERMEDIATE_CERTS_PATH
、 WEBSITE_PUBLIC_CERTS_PATH
、 WEBSITE_ROOT_CERTS_PATH
の各環境変数として、証明書パスを Windows コンテナーに挿入します。 証明書パスが将来変更された場合に備えて、証明書パスをハードコーディングするのではなく、環境変数を使用して証明書パスを参照することをお勧めします。
さらに、 Windows Server Core コンテナーと Windows Nano Server コンテナー は、証明書ストアに証明書を LocalMachine\My
に自動的に読み込みます。 証明書を読み込むには、「 Windows アプリで証明書を読み込む」に示されているのと同じパターンに従います。 Windows Nano ベースのコンテナーの場合は、「ファイル から証明書を読み込む」に示されているように、ファイル パスを使用します。
次の C# コードは、Linux アプリでパブリック証明書を読み込む方法を示しています。
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("/var/ssl/certs/<thumbprint>.der");
var cert = new X509Certificate2(bytes);
// Use the loaded certificate
次の C# コードは、Linux アプリでプライベート証明書を読み込む方法を示しています。
using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("/var/ssl/private/<thumbprint>.p12");
var cert = new X509Certificate2(bytes);
// Use the loaded certificate
Node.js、PHP、Python、または Java のファイルから TLS/SSL 証明書を読み込む方法については、それぞれの言語または Web プラットフォームのドキュメントを参照してください。
証明書を更新または再発行する
証明書を更新してアプリに追加すると、新しい拇印が取得されます。この拇印も アクセス可能にする必要があります。 動作方法は、証明書の種類によって異なります。
パブリック証明書またはプライベート証明書を手動でアップロードする場合:
-
WEBSITE_LOAD_CERTIFICATES
で拇印を明示的に一覧表示する場合は、アプリ設定に新しい拇印を追加します。 -
WEBSITE_LOAD_CERTIFICATES
が*
に設定されている場合は、アプリを再起動して新しい証明書にアクセスできるようにします。
App Service 証明書など、Azure Key Vault の証明書を更新すると、更新された証明書とアプリが同期されるときに、Key Vault からの毎日の同期によって必要な更新が自動的に行われます。
-
WEBSITE_LOAD_CERTIFICATES
更新された証明書の古い拇印が含まれている場合、毎日の同期によって古い拇印が新しい拇印に自動的に更新されます。 -
WEBSITE_LOAD_CERTIFICATES
が*
に設定されている場合、毎日の同期により、新しい証明書に自動的にアクセスできるようになります。