Azure App Service で TLS/SSL バインドを使用してカスタム DNS 名をセキュリティで保護する

この記事では、証明書バインドを作成することで App Service アプリまたは関数アプリカスタム ドメインをセキュリティで保護する方法について説明します。 完了したら、カスタム DNS 名 (https://www.contoso.com など) の https:// エンドポイントで App Service アプリにアクセスできます。

カスタム TLS/SSL 証明書を使用した Web アプリ

証明書でカスタム ドメインを保護する方法は次の 2 つの手順から構成されています。

このチュートリアルでは、以下の内容を学習します。

  • アプリの価格レベルをアップグレードする
  • 証明書を使用してカスタム ドメインをセキュリティで保護する
  • HTTPS の適用
  • TLS 1.1/1.2 の適用
  • スクリプトを使って TLS 管理を自動化する

前提条件

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

注意

プライベート証明書を追加する最も簡単な方法は、無料の App Service マネージド証明書を作成することです。

Web アプリの準備

カスタム TLS/SSL バインディングを作成したり、App Service アプリのクライアント証明書を有効にしたりするには、App Service プランBasicStandardPremium、または Isolated のいずれかのレベルである必要があります。 この手順では、Web アプリが、サポートされている価格レベルであることを確認します。

Azure へのサインイン

Azure Portalを開きます。

[App Services] を検索して選択します。

[App Services] を選択します

[App Services] ページで、Web アプリの名前を選択します。

リストの最初のアプリが強調表示された、実行中のすべての Web アプリのリストを示す、Azure portal の [App Services] ページのスクリーンショット。

Web アプリの管理ページが表示されます。

価格レベルの確認

Web アプリ ページの左側のナビゲーションで [設定] セクションまでスクロールし、 [スケール アップ (App Service のプラン)] を選択します。

スケール アップ メニュー

Web アプリが F1 レベルまたは D1 レベルに含まれていないことを確認します。 Web アプリの現在のレベルは、ダーク ブルーのボックスで強調表示されます。

価格レベルの確認

カスタム SSL は、F1 レベルまたは D1 レベルではサポートされていません。 スケール アップする必要がある場合は、次のセクションの手順に従います。 それ以外の場合は、 [スケール アップ] ページを閉じて、「App Service プランのスケール アップ」セクションはスキップしてください。

App Service プランのスケール アップ

非 Free レベルのいずれかを選びます (B1B2B3、または 運用 カテゴリのいずれかのレベル)。 その他のオプションについては、 [See additional options](その他のオプションを参照する) をクリックします。

[Apply] をクリックします。

価格レベルの選択

次の通知が表示されたら、スケール操作は完了です。

スケール アップの通知

カスタム ドメインをセキュリティで保護する

手順は次のとおりです。

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

アプリの左側のナビゲーションから、 [TLS/SSL バインド] ダイアログを開きます。

  • [カスタム ドメイン][バインディングの追加] の順に選択します
  • [TLS/SSL 設定][TLS/SSL バインディングの追加] の順に選択します

ドメインにバインディングを追加する

[カスタム ドメイン] で、バインドを追加するカスタム ドメインを選択します。

選択したカスタム ドメインの証明書がアプリに既に設定されている場合、[バインドの作成] に直接進みます。 それ以外の場合は続行します。

カスタム ドメインの証明書を追加する

カスタムドメインの証明書がアプリに設定されていない場合、次の 2 つのオプションがあります。

注意

無料証明書を作成したり、Key Vault 証明書をインポートしたりすることもできますが、それは別々に行い、 [TLS/SSL バインド] ダイアログに戻る必要があります。

バインドを作成する

次の表を参考に使用して、 [TLS/SSL バインディング] ダイアログで TLS バインドを構成してから、 [バインドの追加] をクリックします。

設定 説明
カスタム ドメイン TLS/SSL バインドを追加するドメイン名。
プライベート証明書のサムプリント バインドする証明書。
TLS/SSL の種類
  • SNI SSL - 複数の SNI SSL バインディングを追加できます。 このオプションでは、複数の TLS/SSL 証明書を使用して、同一の IP アドレス上の複数のドメインを保護できます。 最新のブラウザーのほとんど (Inernet Explorer、Chrome、Firefox、Opera など) が SNI をサポートしています (詳細については、「Server Name Indication」を参照してください)。
  • IP SSL - IP SSL バインディングを 1 つだけ追加できます。 このオプションでは、TLS/SSL 証明書を 1 つだけ使用して、専用のパブリック IP アドレスを保護します。 バインディングを構成した後は、IP SSL のレコードの再マッピングの手順に従います。
    IP SSL は、Standard レベル以上でのみサポートされます。

操作が完了すると、カスタム ドメインの TLS/SSL 状態が セキュリティで保護された 状態に変わります。

TLS/SSL バインド成功

注意

[カスタム ドメイン] での [Secure](セキュリティ保護) 状態とは、それが証明書を使用してセキュリティで保護されているが、App Service はその証明書が自己署名されたものか有効期限が切れているかをチェックしないことを意味します。たとえば、それによって、ブラウザーにエラーや警告が表示されることもあります。

IP SSL のレコードの再マップ

アプリで IP SSL を使用していない場合、カスタム ドメインの HTTPS のテストに関するセクションにスキップしてください。

行うべき変更は 2 つ考えられます。

  • 既定では、アプリは、共有のパブリック IP アドレスを使用します。 IP SSL で証明書をバインドすると、アプリ用の新規の専用 IP アドレスが App Service によって作成されます。 アプリに A レコードをマップした場合は、この新規の専用 IP アドレスでドメイン レジストリを更新します。

    アプリの [カスタム ドメイン] ページが、新規の専用 IP アドレスで更新されます。 この IP アドレスをコピーして、この新しい IP アドレスに A レコードを再マップします。

  • <app-name>.azurewebsites.net への SNI SSL バインディングがある場合は、sni.<app-name>.azurewebsites.net を指すように CNAME マッピングを再マップします (sni プレフィックスを追加)。

HTTPS のテスト

さまざまなブラウザーで https://<your.custom.domain> にアクセスし、アプリの要求を処理できることを確認します。

contoso.com のカスタム ドメインにブラウザーでアクセスする例を示す画面のスクリーンショット (URL が強調表示されている)。

プロトコルは、アプリケーション コードから "x-appservice-proto" ヘッダーを介して調査することができます。 ヘッダーの値は http または https になります。

注意

アプリで証明書検証エラーが返された場合は、自己署名証明書を使用している可能性があります。

そうでない場合は、証明書を PFX ファイルにエクスポートするときに中間証明書を含めなかった可能性があります。

IP 変更を禁止する

バインディングを削除すると、着信 IP アドレスが変化する場合があります。そのバインディングが IP SSL であっても同様です。 IP SSL バインディングに既に存在する証明書を更新するときには、このことが特に重要となります。 アプリの IP アドレスに変更が生じないようにするには、次の手順に従います。

  1. 新しい証明書をアップロードします。
  2. 古い証明書を削除せずに、新しい証明書を目的のカスタム ドメインにバインドします。 これは、古い証明書を削除する代わりに、バインディングを置き換える操作となります。
  3. 古い証明書を削除します。

HTTPS の適用

既定では、どなたでも引き続き HTTP を使用してアプリにアクセスできます。 すべての HTTP 要求を HTTPS ポートにリダイレクトできます。

アプリ ページの左側のナビゲーションで、 [TLS/SSL の設定] を選択します。 その後、 [HTTPS のみ] で、 [On] を選択します。

HTTPS の適用

操作が完了すると、アプリを指定する HTTP URL のいずれかに移動します。 次に例を示します。

  • http://<app_name>.azurewebsites.net
  • http://contoso.com
  • http://www.contoso.com

TLS バージョンを適用する

アプリでは既定で TLS 1.2 が有効です。これは、PCI DSS などの業界標準で推奨されている TLS レベルです。 異なる TLS バージョンを適用するには、次の手順を実行します。

アプリ ページの左側のナビゲーションで、 [TLS/SSL の設定] を選択します。 次に、 [TLS version](TLS バージョン) で、必要な最低限の TLS バージョンを選択します。 この設定により、受信呼び出しのみが制御されます。

TLS 1.1/1.2 の適用

操作が完了すると、アプリは下位の TLS バージョンでの接続をすべて拒否します。

TLS 終了の処理

App Service では、TLS 終了がネットワーク ロード バランサーで発生するため、すべての HTTPS 要求は暗号化されていない HTTP 要求としてアプリに到達します。 ユーザー要求が暗号化されているかどうかをアプリ ロジックが確認する必要がある場合は、X-Forwarded-Proto ヘッダーを調べます。

Linux Node.js 構成ガイドなどの言語固有の構成ガイドでは、アプリケーション コード内の HTTPS セッションを検出する方法について説明しています。

証明書バインディングの更新

注意

購入した App Service 証明書を更新するには、(App Service) 証明書のエクスポートに関する記事を参照してください。 App Service 証明書を自動的に更新し、バインディングを自動的に同期できます。

期限切れの証明書を更新する場合、新しい証明書で証明書のバインディングを更新する方法によっては、ユーザー エクスペリエンスに悪影響を及ぼす可能性があります。 たとえば、バインディングを削除すると、そのバインディングが IP ベースであっても、インバウンド IP アドレスが変化する場合があります。 IP ベースのバインディングに既に存在する証明書を更新するときには、このことが特に重要となります。 アプリの IP アドレスに変更が生じないようにし、アプリのダウンタイムを回避するには、次の手順に従います。

  1. 新しい証明書をアップロードします。
  2. 既存の (期限切れ) 証明書を削除せずに、新しい証明書を同じカスタム ドメインにバインドします。 この操作により、既存の証明書が削除されることなく、バインディングが置き換えられます。
  3. 既存の証明書を削除します。

スクリプトで自動化する

Azure CLI

#!/bin/bash

fqdn=<replace-with-www.{yourdomain}>
pfxPath=<replace-with-path-to-your-.PFX-file>
pfxPassword=<replace-with-your=.PFX-password>
resourceGroup=myResourceGroup
webappname=mywebapp$RANDOM

# Create a resource group.
az group create --location westeurope --name $resourceGroup

# Create an App Service plan in Basic tier (minimum required by custom domains).
az appservice plan create --name $webappname --resource-group $resourceGroup --sku B1

# Create a web app.
az webapp create --name $webappname --resource-group $resourceGroup \
--plan $webappname

echo "Configure a CNAME record that maps $fqdn to $webappname.azurewebsites.net"
read -p "Press [Enter] key when ready ..."

# Before continuing, go to your DNS configuration UI for your custom domain and follow the 
# instructions at https://aka.ms/appservicecustomdns to configure a CNAME record for the 
# hostname "www" and point it your web app's default domain name.

# Map your prepared custom domain name to the web app.
az webapp config hostname add --webapp-name $webappname --resource-group $resourceGroup \
--hostname $fqdn

# Upload the SSL certificate and get the thumbprint.
thumbprint=$(az webapp config ssl upload --certificate-file $pfxPath \
--certificate-password $pfxPassword --name $webappname --resource-group $resourceGroup \
--query thumbprint --output tsv)

# Binds the uploaded SSL certificate to the web app.
az webapp config ssl bind --certificate-thumbprint $thumbprint --ssl-type SNI \
--name $webappname --resource-group $resourceGroup

echo "You can now browse to https://$fqdn"

PowerShell

$fqdn="<Replace with your custom domain name>"
$pfxPath="<Replace with path to your .PFX file>"
$pfxPassword="<Replace with your .PFX password>"
$webappname="mywebapp$(Get-Random)"
$location="West Europe"

# Create a resource group.
New-AzResourceGroup -Name $webappname -Location $location

# Create an App Service plan in Free tier.
New-AzAppServicePlan -Name $webappname -Location $location `
-ResourceGroupName $webappname -Tier Free

# Create a web app.
New-AzWebApp -Name $webappname -Location $location -AppServicePlan $webappname `
-ResourceGroupName $webappname

Write-Host "Configure a CNAME record that maps $fqdn to $webappname.azurewebsites.net"
Read-Host "Press [Enter] key when ready ..."

# Before continuing, go to your DNS configuration UI for your custom domain and follow the 
# instructions at https://aka.ms/appservicecustomdns to configure a CNAME record for the 
# hostname "www" and point it your web app's default domain name.

# Upgrade App Service plan to Basic tier (minimum required by custom SSL certificates)
Set-AzAppServicePlan -Name $webappname -ResourceGroupName $webappname `
-Tier Basic

# Add a custom domain name to the web app. 
Set-AzWebApp -Name $webappname -ResourceGroupName $webappname `
-HostNames @($fqdn,"$webappname.azurewebsites.net")

# Upload and bind the SSL certificate to the web app.
New-AzWebAppSSLBinding -WebAppName $webappname -ResourceGroupName $webappname -Name $fqdn `
-CertificateFilePath $pfxPath -CertificatePassword $pfxPassword -SslState SniEnabled

その他のリソース