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

この記事では、証明書バインドを作成することで App Service アプリまたは関数アプリカスタム ドメインをセキュリティで保護する方法について説明します。This article shows you how to secure the custom domain in your App Service app or function app by creating a certificate binding. 完了したら、カスタム DNS 名 (https://www.contoso.com など) の https:// エンドポイントで App Service アプリにアクセスできます。When you're finished, you can access your App Service app at the https:// endpoint for your custom DNS name (for example, https://www.contoso.com).

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

証明書でカスタム ドメインを保護する方法は次の 2 つの手順から構成されています。Securing a custom domain with a certificate involves two steps:

このチュートリアルでは、以下の内容を学習します。In this tutorial, you learn how to:

  • アプリの価格レベルをアップグレードするUpgrade your app's pricing tier
  • 証明書を使用してカスタム ドメインをセキュリティで保護するSecure a custom domain with a certificate
  • HTTPS の適用Enforce HTTPS
  • TLS 1.1/1.2 の適用Enforce TLS 1.1/1.2
  • スクリプトを使って TLS 管理を自動化するAutomate TLS management with scripts

前提条件Prerequisites

この攻略ガイドに従うには:To follow this how-to guide:

注意

プライベート証明書を追加する最も簡単な方法は、無料の App Service マネージド証明書 (プレビュー) を作成することです。The easiest way to add a private certificate is to create a free App Service Managed Certificate (Preview).

Web アプリの準備Prepare your web app

カスタム セキュリティ バインディングを作成するか、お使いの App Service アプリのクライアント証明書を有効にするには、App Service プランBasicStandardPremium、または Isolated のいずれかのレベルである必要があります。To create custom security bindings or enable client certificates for your App Service app, your App Service plan must be in the Basic, Standard, Premium, or Isolated tier. この手順では、Web アプリが、サポートされている価格レベルであることを確認します。In this step, you make sure that your web app is in the supported pricing tier.

Azure へのサインインSign in to Azure

Azure Portalを開きます。Open the Azure portal.

[App Services] を検索して選択します。Search for and select App Services.

[App Services] を選択します

[App Services] ページで、Web アプリの名前を選択します。On the App Services page, select the name of your web app.

Azure アプリへのポータル ナビゲーション

Web アプリの管理ページが表示されます。You have landed on the management page of your web app.

価格レベルの確認Check the pricing tier

Web アプリ ページの左側のナビゲーションで [設定] セクションまでスクロールし、 [スケール アップ (App Service のプラン)] を選択します。In the left-hand navigation of your web app page, scroll to the Settings section and select Scale up (App Service plan).

スケール アップ メニュー

Web アプリが F1 レベルまたは D1 レベルに含まれていないことを確認します。Check to make sure that your web app is not in the F1 or D1 tier. Web アプリの現在のレベルは、ダーク ブルーのボックスで強調表示されます。Your web app's current tier is highlighted by a dark blue box.

価格レベルの確認

カスタム SSL は、F1 レベルまたは D1 レベルではサポートされていません。Custom SSL is not supported in the F1 or D1 tier. スケール アップする必要がある場合は、次のセクションの手順に従います。If you need to scale up, follow the steps in the next section. それ以外の場合は、 [スケール アップ] ページを閉じて、「App Service プランのスケール アップ」セクションはスキップしてください。Otherwise, close the Scale up page and skip the Scale up your App Service plan section.

App Service プランのスケール アップScale up your App Service plan

非 Free レベルのいずれかを選びます (B1B2B3、または運用カテゴリのいずれかのレベル)。Select any of the non-free tiers (B1, B2, B3, or any tier in the Production category). その他のオプションについては、 [See additional options](その他のオプションを参照する) をクリックします。For additional options, click See additional options.

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

価格レベルの選択

次の通知が表示されたら、スケール操作は完了です。When you see the following notification, the scale operation is complete.

スケール アップの通知

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

手順は次のとおりです。Do the following steps:

Azure portal の左側のメニューから、 [App Services] > <app-name> を選択します。In the Azure portal, from the left menu, select App Services > <app-name>.

アプリの左側のナビゲーションから、 [TLS/SSL バインド] ダイアログを開きます。From the left navigation of your app, start the TLS/SSL Binding dialog by:

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

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

[カスタム ドメイン] で、バインドを追加するカスタム ドメインを選択します。In Custom Domain, select the custom domain you want to add a binding for.

選択したカスタム ドメインの証明書がアプリに既に設定されている場合、[バインドの作成] に直接進みます。If your app already has a certificate for the selected custom domain, go to Create binding directly. それ以外の場合は続行します。Otherwise, keep going.

カスタム ドメインの証明書を追加するAdd a certificate for custom domain

カスタムドメインの証明書がアプリに設定されていない場合、次の 2 つのオプションがあります。If your app has no certificate for the selected custom domain, then you have two options:

注意

無料証明書を作成したり (プレビュー)、Key Vault 証明書をインポートしたりすることもできますが、それは別々に行い、 [TLS/SSL バインド] ダイアログに戻る必要があります。You can also Create a free certificate (Preview) or Import a Key Vault certificate, but you must do it separately and then return to the TLS/SSL Binding dialog.

バインドを作成するCreate binding

次の表を参考に使用して、 [TLS/SSL バインディング] ダイアログで TLS バインドを構成してから、 [バインドの追加] をクリックします。Use the following table to help you configure the TLS binding in the TLS/SSL Binding dialog, then click Add Binding.

設定Setting 説明Description
カスタム ドメインCustom domain TLS/SSL バインドを追加するドメイン名。The domain name to add the TLS/SSL binding for.
プライベート証明書のサムプリントPrivate Certificate Thumbprint バインドする証明書。The certificate to bind.
TLS/SSL の種類TLS/SSL Type
  • SNI SSL - 複数の SNI SSL バインディングを追加できます。SNI SSL - Multiple SNI SSL bindings may be added. このオプションでは、複数の TLS/SSL 証明書を使用して、同一の IP アドレス上の複数のドメインを保護できます。This option allows multiple TLS/SSL certificates to secure multiple domains on the same IP address. 最新のブラウザーのほとんど (Inernet Explorer、Chrome、Firefox、Opera など) が SNI をサポートしています (詳細については、「Server Name Indication」を参照してください)。Most modern browsers (including Internet Explorer, Chrome, Firefox, and Opera) support SNI (for more information, see Server Name Indication).
  • IP SSL - IP SSL バインディングを 1 つだけ追加できます。IP SSL - Only one IP SSL binding may be added. このオプションでは、TLS/SSL 証明書を 1 つだけ使用して、専用のパブリック IP アドレスを保護します。This option allows only one TLS/SSL certificate to secure a dedicated public IP address. バインディングを構成した後は、IP SSL のレコードの再マッピングの手順に従います。After you configure the binding, follow the steps in Remap records for IP SSL.
    IP SSL は、Standard レベル以上でのみサポートされます。IP SSL is supported only in Standard tier or above.

操作が完了すると、カスタム ドメインの TLS/SSL 状態がセキュリティで保護された状態に変わります。Once the operation is complete, the custom domain's TLS/SSL state is changed to Secure.

TLS/SSL バインド成功

注意

[カスタム ドメイン] での [Secure](セキュリティ保護) 状態とは、それが証明書を使用してセキュリティで保護されているが、App Service はその証明書が自己署名されたものか有効期限が切れているかをチェックしないことを意味します。たとえば、それによって、ブラウザーにエラーや警告が表示されることもあります。A Secure state in the Custom domains means that it is secured with a certificate, but App Service doesn't check if the certificate is self-signed or expired, for example, which can also cause browsers to show an error or warning.

IP SSL のレコードの再マップRemap records for IP SSL

アプリで IP SSL を使用していない場合、カスタム ドメインの HTTPS のテストに関するセクションにスキップしてください。If you don't use IP SSL in your app, skip to Test HTTPS for your custom domain.

行うべき変更は 2 つ考えられます。There are two changes you need to make, potentially:

  • 既定では、アプリは、共有のパブリック IP アドレスを使用します。By default, your app uses a shared public IP address. IP SSL で証明書をバインドすると、アプリ用の新規の専用 IP アドレスが App Service によって作成されます。When you bind a certificate with IP SSL, App Service creates a new, dedicated IP address for your app. アプリに A レコードをマップした場合は、この新規の専用 IP アドレスでドメイン レジストリを更新します。If you mapped an A record to your app, update your domain registry with this new, dedicated IP address.

    アプリの [カスタム ドメイン] ページが、新規の専用 IP アドレスで更新されます。Your app's Custom domain page is updated with the new, dedicated IP address. この IP アドレスをコピーして、この新しい IP アドレスに A レコードを再マップします。Copy this IP address, then remap the A record to this new IP address.

  • <app-name>.azurewebsites.net への SNI SSL バインディングがある場合は、sni.<app-name>.azurewebsites.net を指すように CNAME マッピングを再マップします (sni プレフィックスを追加)。If you have an SNI SSL binding to <app-name>.azurewebsites.net, remap any CNAME mapping to point to sni.<app-name>.azurewebsites.net instead (add the sni prefix).

HTTPS のテストTest HTTPS

さまざまなブラウザーで https://<your.custom.domain> にアクセスし、アプリの要求を処理できることを確認します。In various browsers, browse to https://<your.custom.domain> to verify that it serves up your app.

Azure アプリへのポータル ナビゲーション

プロトコルは、アプリケーション コードから "x-appservice-proto" ヘッダーを介して調査することができます。Your application code can inspect the protocol via the "x-appservice-proto" header. ヘッダーの値は http または https になります。The header will have a value of http or https.

注意

アプリで証明書検証エラーが返された場合は、自己署名証明書を使用している可能性があります。If your app gives you certificate validation errors, you're probably using a self-signed certificate.

そうでない場合は、証明書を PFX ファイルにエクスポートするときに中間証明書を含めなかった可能性があります。If that's not the case, you may have left out intermediate certificates when you export your certificate to the PFX file.

IP 変更を禁止するPrevent IP changes

バインディングを削除すると、着信 IP アドレスが変化する場合があります。そのバインディングが IP SSL であっても同様です。Your inbound IP address can change when you delete a binding, even if that binding is IP SSL. IP SSL バインディングに既に存在する証明書を更新するときには、このことが特に重要となります。This is especially important when you renew a certificate that's already in an IP SSL binding. アプリの IP アドレスに変更が生じないようにするには、次の手順に従います。To avoid a change in your app's IP address, follow these steps in order:

  1. 新しい証明書をアップロードします。Upload the new certificate.
  2. 古い証明書を削除せずに、新しい証明書を目的のカスタム ドメインにバインドします。Bind the new certificate to the custom domain you want without deleting the old one. これは、古い証明書を削除する代わりに、バインディングを置き換える操作となります。This action replaces the binding instead of removing the old one.
  3. 古い証明書を削除します。Delete the old certificate.

HTTPS の適用Enforce HTTPS

既定では、どなたでも引き続き HTTP を使用してアプリにアクセスできます。By default, anyone can still access your app using HTTP. すべての HTTP 要求を HTTPS ポートにリダイレクトできます。You can redirect all HTTP requests to the HTTPS port.

アプリ ページで、左側のナビゲーションにある [SSL 設定] を選択します。In your app page, in the left navigation, select SSL settings. その後、 [HTTPS のみ] で、 [On] を選択します。Then, in HTTPS Only, select On.

HTTPS の適用

操作が完了すると、アプリを指定する HTTP URL のいずれかに移動します。When the operation is complete, navigate to any of the HTTP URLs that point to your app. 次に例を示します。For example:

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

TLS バージョンを適用するEnforce TLS versions

アプリでは既定で TLS 1.2 が有効です。これは、PCI DSS などの業界標準で推奨されている TLS レベルです。Your app allows TLS 1.2 by default, which is the recommended TLS level by industry standards, such as PCI DSS. 異なる TLS バージョンを適用するには、次の手順を実行します。To enforce different TLS versions, follow these steps:

アプリ ページで、左側のナビゲーションにある [SSL 設定] を選択します。In your app page, in the left navigation, select SSL settings. 次に、 [TLS version](TLS バージョン) で、必要な最低限の TLS バージョンを選択します。Then, in TLS version, select the minimum TLS version you want. この設定により、受信呼び出しのみが制御されます。This setting controls the inbound calls only.

TLS 1.1/1.2 の適用

操作が完了すると、アプリは下位の TLS バージョンでの接続をすべて拒否します。When the operation is complete, your app rejects all connections with lower TLS versions.

TLS 終了の処理Handle TLS termination

App Service では、TLS 終了がネットワーク ロード バランサーで発生するため、すべての HTTPS 要求は暗号化されていない HTTP 要求としてアプリに到達します。In App Service, TLS termination happens at the network load balancers, so all HTTPS requests reach your app as unencrypted HTTP requests. ユーザー要求が暗号化されているかどうかをアプリ ロジックが確認する必要がある場合は、X-Forwarded-Proto ヘッダーを調べます。If your app logic needs to check if the user requests are encrypted or not, inspect the X-Forwarded-Proto header.

Linux Node.js 構成ガイドなどの言語固有の構成ガイドでは、アプリケーション コード内の HTTPS セッションを検出する方法について説明しています。Language specific configuration guides, such as the Linux Node.js configuration guide, shows you how to detect an HTTPS session in your application code.

スクリプトで自動化するAutomate with scripts

Azure CLIAzure 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"

PowerShellPowerShell

$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

その他のリソースMore resources