Azure App Service の自分のコードから TLS/SSL 証明書を使用する

App Service に追加したパブリック証明書またはプライベート証明書には、アプリケーション コード内からアクセスすることができます。 アプリ コードはクライアントとして、証明書認証を必要とする外部サービスにアクセスすることがあるほか、暗号タスクを実行しなければならない場合もあります。 この攻略ガイドでは、アプリケーション コードで公開またはプライベートの証明書を使用する方法について説明します。

コードで証明書を使用するこの方法では、App Service の TLS 機能を利用します。そのため、お客様のアプリは Basic レベル以上でなければなりません。 アプリが Free レベルまたは Shared レベルの場合は、アプリのリポジトリに証明書ファイルを格納することができます。

App Service の TLS/SSL 証明書の管理機能を使用すれば、証明書とアプリケーション コードを分離して管理し、機密データを保護できます。

前提条件

この攻略ガイドに従うには:

拇印を確認する

Azure portal の左側のメニューから、[App Services]><app-name> を選択します。

アプリの左側のナビゲーションで [証明書] を選び、[Bring Your Own Certificate (.pfx)] または [公開キー証明書 (.cer)] を選びます。

使用する証明書を見つけ、拇印をコピーします。

Copy the certificate thumbprint

証明書をアクセス可能にする

アプリ コードで証明書にアクセスするには、Cloud Shell で次のコマンドを実行して、WEBSITE_LOAD_CERTIFICATES アプリ設定に拇印を追加します。

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 アプリの設定により、現在の User\My にある 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 などではなく FTPS を使用して証明書をアップロードすることをお勧めします。 プライベート証明書などの機密データは、ソース管理から分離しておく必要があります。

Note

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 コンテナーで証明書を読み込む

Windows または Linux カスタム コンテナー (組み込みの Linux コンテナーを含む) は、WEBSITE_LOAD_CERTIFICATES アプリ設定によって、指定された証明書にファイルとしてアクセスできるようになります。 それらのファイルは、次のディレクトリに格納されます。

コンテナー プラットフォーム パブリック証明書 プライベート証明書
Windows コンテナー C:\appservice\certificates\public C:\appservice\certificates\private
Linux コンテナー /var/ssl/certs /var/ssl/private

証明書のファイル名は、証明書の拇印です。

Note

App Service を使用すると、証明書のパスは、環境変数 (WEBSITE_PRIVATE_CERTS_PATHWEBSITE_INTERMEDIATE_CERTS_PATHWEBSITE_PUBLIC_CERTS_PATHWEBSITE_ROOT_CERTS_PATH) として Windows コンテナーに挿入されます。 証明書のパスを今後変更する場合に備え、証明書のパスをハードコーディングする代わりに、環境変数を使用して証明書のパスを参照することをお勧めします。

さらに、LocalMachine\My では、Windows Server Core コンテナーによって、証明書が証明書ストアに自動的に読み込まれます。 証明書を読み込むには、「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 証明書などで行われるように Key Vault で証明書を更新すると、Key Vault からの毎日の同期によって更新された証明書とアプリを同期するときに、必要な更新が自動的に行われます。

  • WEBSITE_LOAD_CERTIFICATES に更新された証明書の古いサムプリントが含まれている場合、毎日の同期によって古いサムプリントが新しいサムプリントに自動的に更新されます。
  • WEBSITE_LOAD_CERTIFICATES* に設定されている場合、毎日の同期によって新しい証明書が自動的にアクセス可能になります。

その他のリソース