在 Azure 应用服务中使用 TLS/SSL 绑定保护自定义 DNS 名称

本文介绍如何通过创建证书绑定来确保应用服务应用函数应用自定义域的安全。 完成后,可访问自定义 DNS 名称(例如,https://www.contoso.com)的 https:// 终结点处的应用服务应用。

带有自定义 TLS/SSL 证书的 Web 应用

使用证书来确保自定义域的安全涉及两个步骤:

  • 将专用证书添加到应用服务,以满足所有专用证书要求。
  • 创建相应自定义域的 TLS 绑定。 本文介绍第二步。

在本教程中,你将了解如何执行以下操作:

  • 升级应用的定价层
  • 使用证书确保自定义域的安全
  • 实施 HTTPS
  • 强制实施 TLS 1.1/1.2
  • 使用脚本自动完成 TLS 管理

先决条件

按照本操作方法指南操作:

备注

添加专用证书最简单的方法是创建免费的应用服务托管证书。

准备 Web 应用

若要为应用服务应用创建自定义安全绑定或启用客户端证书,应用服务计划必须位于“基本” 、“标准” 、“高级” 或“独立” 层级。 在此步骤中,请确保 Web 应用位于受支持的定价层。

登录 Azure

打开 Azure 门户

搜索并选择“应用服务”。

选择应用服务

在“应用服务”页上,选择 Web 应用的名称 。

在门户中导航到 Azure 应用

你已登录到 Web 应用的管理页。

检查定价层

在 Web 应用页的左侧导航窗格中,滚动到“设置” 部分,然后选择“增加(应用服务计划)” 。

扩展菜单

检查以确保 Web 应用不在 F1D1 层中。 深蓝色的框突出显示了 Web 应用的当前层。

检查定价层

F1D1 层不支持自定义 SSL。 如果需要增加,请按照下一部分中的步骤进行操作。 否则,请关闭“纵向扩展” 页,并跳过纵向扩展应用服务计划部分。

纵向扩展应用服务计划

选择任何非免费层(B1B2B3,或“生产” 类别中的任何层)。 有关其他选项,请单击“查看其他选项” 。

单击“应用” 。

选择定价层

看到以下通知时,说明缩放操作已完成。

扩展通知

确保自定义域的安全

执行以下步骤:

Azure 门户的左侧菜单中,选择“应用程序服务” > “<app-name>” 。

在应用的左侧导航窗格中,通过以下方式启动“TLS/SSL 绑定”对话框:

  • 选择“自定义域” > “添加绑定”
  • 选择“TLS/SSL 设置” > “添加 TLS/SSL 绑定”

为域添加绑定

在“自定义域”中,选择要添加绑定的自定义域。

如果应用已具有所选自定义域的证书,请直接转到创建绑定。 反之,请继续操作。

创建绑定

根据下表的要求在“TLS/SSL 绑定”对话框中配置 TLS 绑定,然后单击“添加绑定” 。

设置 说明
自定义域 要为其添加 TLS/SSL 绑定的域名。
私有证书指纹 要绑定的证书。
TLS/SSL 类型
  • SNI SSL - 可添加多个 SNI SSL 绑定。 选择此选项可以使用多个 TLS/SSL 证书来保护同一 IP 地址上的多个域。 大多数新式浏览器(包括 Internet Explorer、Chrome、Firefox 和 Opera)都支持 SNI。
  • IP SSL - 只能添加一个 IP SSL 绑定。 选择此选项只能使用一个 TLS/SSL 证书来保护专用公共 IP 地址。 配置绑定后,请按照重新映射 IP SSL 的记录中的步骤进行操作。
    IP SSL 仅在“标准” 层或更高层中受支持。

操作完成之后,自定义域的 TLS/SSL 状态会更改为“安全” 。

TLS/SSL 绑定成功

备注

“自定义域”中的状态为“安全”意味着已使用证书保护该域,但应用服务并未检查该证书是自签名证书还是已过期证书,这可能也会导致浏览器异常,例如显示错误或警告。

重新映射 IP SSL 的记录

如果不在应用中使用 IP SSL,请跳到针对自定义域测试 HTTPS

可能需要进行两项更改:

  • 默认情况下,应用使用共享的公共 IP 地址。 将证书与 IP SSL 绑定时,应用服务会为应用创建新的专用 IP 地址。 如果已将 A 记录映射到应用,请使用这个新的专用 IP 地址更新域注册表。

    将使用新的专用 IP 地址更新应用的“自定义域”页。 复制此 IP 地址,然后将 A 记录重新映射到此新 IP 地址。

  • 如果已有到 <app-name>.chinacloudsites.cn 的 SNI SSL 绑定,请重新映射任何 CNAME 映射,让其改为指向 sni.<app-name>.chinacloudsites.cn(添加 sni 前缀)。

测试 HTTPS

在不同的浏览器中,导航到 https://<your.custom.domain> 以核实其是否适合应用。

屏幕截图显示浏览到自定义域的示例,其中突出显示了 contoso.com URL。

应用程序代码可以通过“x-appservice-proto”标头检查协议。 该标头的值将为 httphttps

备注

如果应用显示证书验证错误,可能是因为使用自签名证书。

如果不是这样,可能是在将证书导出为 PFX 文件时遗漏了中间证书。

防止 IP 更改

在删除某个绑定时,即使该绑定是 IP SSL,入站 IP 地址也可能会更改。 在续订已进行 IP SSL 绑定的证书时,了解这一点尤为重要。 若要避免应用的 IP 地址更改,请按顺序执行以下步骤:

  1. 上传新证书。
  2. 将新证书绑定到所需的自定义域,不要删除旧证书。 此操作替换而不是删除旧的绑定。
  3. 删除旧证书。

实施 HTTPS

默认情况下,任何人都仍可使用 HTTP 访问应用。 可以将所有 HTTP 请求都重定向到 HTTPS 端口。

在应用页的左侧导航窗格中,选择“TLS/SSL 设置”。 然后,在“仅 HTTPS”中,选择“启用”。

实施 HTTPS

该操作完成后,将导航到指向应用的任一 HTTP URL。 例如:

  • http://<app_name>.chinacloudsites.cn
  • http://contoso.com
  • http://www.contoso.com

强制实施 TLS 版本

应用默认情况下允许 TLS 1.2,这是行业标准(例如 PCI DSS)建议的 TLS 级别。 若要强制实施不同的 TLS 版本,请按照下列步骤操作:

在应用页的左侧导航窗格中,选择“TLS/SSL 设置”。 然后,在“TLS 版本”中,选择所需的最低 TLS 版本。 此设置仅控制入站调用。

强制实施 TLS 1.1 或 1.2

该操作完成后,你的应用将拒绝使用更低 TLS 版本的所有连接。

处理 TLS 终止

在应用服务中,TLS 终止在网络负载均衡器上发生,因此,所有 HTTPS 请求将以未加密的 HTTP 请求形式访问你的应用。 如果应用逻辑需要检查用户请求是否已加密,可以检查 X-Forwarded-Proto 标头。

特定于语言的配置指南,如 Linux Node.js 配置指南,介绍如何在应用程序代码中检测 HTTPS 会话。

使用脚本自动化

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 chinaeast --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.chinacloudsites.cn"
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="China North"

# 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.chinacloudsites.cn"
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://docs.azure.cn/app-service-web/web-sites-custom-domain-name#step-2-create-the-dns-records 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.chinacloudsites.cn")

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

更多资源