Azure Websites アプリケーションでの証明書の使用
このポストは、10 月 27 日に投稿された Using Certificates in Azure Websites Applications の翻訳です。
Azure Websites 上のアプリケーションで証明書を使用する必要がある場合、Azure Websites の証明書コレクションに証明書をアップロードし、サイトの個人用証明書ストアを通じて Web アプリケーションで利用することができます。この機能は専用サイト (Basic レベル、Standard レベル) のみに提供されています。ここではこの処理を実行する方法の詳細な手順をご紹介しますが、その前に、この機能の必要性と変更点について簡単にご説明したいと思います。
証明書に含まれる暗号化キーは、Web アプリケーションが認証や署名などの処理を行うために利用します。一般的に暗号化キーの機密性は保護する必要があります。以前は、Azure Websites アプリケーションで証明書のキーを利用する場合、証明書とその秘密キーを (通常は .pfx 形式で) アプリケーションの App_Data ディレクトリに格納し、そこから利用する必要がありました。この解決法は有効ではありますが、いくつかの難点があります。まず、証明書に含まれる秘密キーをアプリケーション コードや開発者から隠すことができません。また、オープン ソースのアプリケーションで使用する証明書を非公開にする必要がある場合や、開発者による証明書の秘密キーへのアクセスを回避したい場合にも、App_Data を使用する方法は不都合です。
Azure Websites アプリケーションで使用される証明書の設定
Azure Websites アプリケーションで使用される証明書を設定するには、Azure 管理ポータルを使用する方法と Azure Websites REST API を使用する方法の 2 種類があります。ここでは両方の手順をご紹介します。
1. 証明書をアップロードする
a. Azure 管理ポータルを使用する場合
Azure 管理ポータルにログインして、証明書のアップロード先となる Websites を選択します。次に、上部の [CONFIGURE] オプションを選択します。
[certificates] セクションまでスクロールして、[upload a certificate] ボタンをクリックします。
表示されるダイアログ ボックスで .pfx ファイルを参照し、証明書の暗号化解除用パスワードを入力します。
Azure 管理ポータルの [certificates] セクションに、証明書と次の手順で必要となる拇印が表示されます。
b. Azure Websites REST API を使用する場合
Azure Websites で証明書の追加 API を使用して証明書をアップロードすることもできます。ここでは特に SSL 証明書について言及していますが、どの証明書をアップロードする場合にも使用できます。
2. アプリケーション設定を追加する
WEBSITE_LOAD_CERTIFICATES という名前のアプリケーション設定を追加し、その値を証明書の拇印に設定することで、Web アプリケーションから証明書にアクセスできるようになります。複数の拇印の値をカンマ区切りで指定することも、この値に “ * “ (引用符は不要) を設定し、すべての証明書を Web アプリケーションの個人用証明書ストアにアップロードすることもできます。
Websites にこの設定を追加するには、管理ポータルで Websites の [CONFIGURE] オプションに移動して、[app settings] セクションまでスクロールし、以下の画像のように、前の手順でアップロードした証明書の拇印を使用して設定を追加します。
ワーカー プロセスの ApplicationPoolIdentity の個人用証明書ストアに証明書がインストールされます。
3. アプリケーションからアクセスする
次の C# コードのサンプルを使用することで、Web アプリケーションから拇印を使用して上記の例に示したクライアント証明書にアクセスできます。コード内の拇印はご自分の証明書の拇印に置き換えてください。
using System;
using System.Security.Cryptography.X509Certificates;namespace UseCertificateInAzureWebsiteApp
{
class Program
{
static void Main(string[] args)
{
X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
// 下記をご自分の証明書の拇印に置き換えてください
“E661583E8FABEF4C0BEF694CBC41C28FB81CD870”,
false);
// 拇印を使用して最初の証明書を取得する
if (certCollection.Count > 0)
{
X509Certificate2 cert = certCollection[0];
// 証明書を使用する
Console.WriteLine(cert.FriendlyName);
}
certStore.Close();
}
}
}