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 인증서가 포함된 웹앱

인증서로 사용자 지정 도메인을 보호하려면 다음 두 단계가 필요합니다.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 Managed Certificate 만들기(미리 보기)입니다.The easiest way to add a private certificate is to create a free App Service Managed Certificate (Preview).

웹앱 준비Prepare your web app

사용자 지정 보안 바인딩을 만들거나 App Service 앱에 대한 클라이언트 인증서를 사용하도록 설정하려면 App Service 계획기본, 표준, 프리미엄 또는 격리 계층에 있어야 합니다.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. 이 단계에서는 웹앱이 지원되는 가격 책정 계층에 있음을 확인합니다.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 Service 선택

App Service 페이지에서 웹앱의 이름을 선택합니다.On the App Services page, select the name of your web app.

Azure 앱에 대한 포털 탐색

웹앱의 관리 페이지에 연결되었습니다.You have landed on the management page of your web app.

가격 책정 계층 확인Check the pricing tier

웹앱 페이지의 왼쪽 탐색 영역에서 설정 섹션으로 스크롤하고 강화(App Service 계획) 를 선택합니다.In the left-hand navigation of your web app page, scroll to the Settings section and select Scale up (App Service plan).

강화 메뉴

웹앱이 F1 또는 D1 계층이 아닌지 확인합니다.Check to make sure that your web app is not in the F1 or D1 tier. 웹앱의 현재 계층이 진한 파란색 상자로 강조 표시됩니다.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

유료 계층(B1, B2, B3, 또는 프로덕션 범주의 모든 계층) 중 하나를 선택합니다.Select any of the non-free tiers (B1, B2, B3, or any tier in the Production category). 추가 옵션을 보려면 추가 옵션 보기를 클릭합니다.For additional options, click See additional options.

적용을 클릭합니다.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

앱에 선택한 사용자 지정 도메인에 대한 인증서가 없는 경우 다음 두 가지 옵션을 사용할 수 있습니다.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 DescriptionDescription
사용자 지정 도메인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. 최신 브라우저(Internet Explorer, Chrome, Firefox 및 Opera 포함)는 SNI를 지원합니다(자세한 내용은 서버 이름 표시 참조).Most modern browsers (including Internet Explorer, Chrome, Firefox, and Opera) support SNI (for more information, see Server Name Indication).
  • IP SSL - IP SSL 바인딩 하나만 추가할 수 있습니다.IP SSL - Only one IP SSL binding may be added. 이 옵션을 사용하면 전용 공용 IP 주소를 보호하는 데 하나의 TLS/SSL 인증서만 사용할 수 있습니다.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은 표준 계층 이상에서만 지원됩니다.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 바인딩 성공

참고

사용자 지정 도메인보호 상태는 인증서를 사용하여 보호됨을 의미하지만, 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.

다음과 같은 두 가지 변경 작업을 수행해야 합니다.There are two changes you need to make, potentially:

  • 기본적으로 앱에서는 공유 공용 IP 주소를 사용합니다.By default, your app uses a shared public IP address. IP SSL을 사용하여 인증서를 바인딩하면 App Service에서 앱에 대한 새로운 전용 IP 주소를 만듭니다.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 바인딩이 있는 경우 모든 CNAME 매핑을 다시 매핑하여 대신 sni.<app-name>.azurewebsites.net(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 SSL이더라도 바인딩을 삭제하면 인바운드 IP 주소가 변경될 수 있습니다.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. HTTPS 포트에 모든 HTTP 요청을 리디렉션할 수 있습니다.You can redirect all HTTP requests to the HTTPS port.

앱 페이지의 왼쪽 탐색 영역에서 SSL 설정을 선택합니다.In your app page, in the left navigation, select SSL settings. 그런 다음 HTTPS에만 해당에서 켜기를 선택합니다.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

앱에는 PCI DSS와 같이 업계 표준에서 권장되는 TLS 수준인 TLS 1.2가 기본적으로 허용됩니다.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 버전에서 원하는 최소 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