在 Azure 应用服务中使用 TLS/SSL 绑定保护自定义 DNS 名称
本文介绍如何通过创建证书绑定来确保应用服务应用或函数应用中自定义域的安全。 完成后,可访问自定义 DNS 名称(例如,https://www.contoso.com
)的 https://
终结点处的应用服务应用。
使用证书来确保自定义域的安全涉及两个步骤:
- 将专用证书添加到应用服务,以满足所有专用证书要求。
- 创建相应自定义域的 TLS 绑定。 本文介绍第二步。
在本教程中,你将了解如何执行以下操作:
- 升级应用的定价层
- 使用证书确保自定义域的安全
- 实施 HTTPS
- 强制实施 TLS 1.1/1.2
- 使用脚本自动完成 TLS 管理
先决条件
按照本操作方法指南操作:
准备 Web 应用
若要为应用服务应用创建自定义 TLS/SSL 绑定或启用客户端证书,应用服务计划必须位于“基本”、“标准”、“高级”或“独立”层级 。 要确保 Web 应用位于受支持的定价层,请执行以下步骤:
转到 Web 应用
在 Azure 门户的搜索框中,查找并选择“应用服务”。
在“应用服务”页上,选择 Web 应用的名称。
现在你位于 Web 应用的管理页上。
检查定价层
在 Web 应用左侧菜单的“设置”部分下,选择“纵向扩展(应用服务计划)”。
确保 Web 应用不在 F1 或 D1 层中,该层不支持自定义 TLS/SSL。
深蓝色的框突出显示了 Web 应用的当前层。
如果需要增加,请按照下一部分中的步骤进行操作。 否则,请关闭“纵向扩展”页,并跳过纵向扩展应用服务计划部分。
纵向扩展应用服务计划
选择任何非免费层,例如 B1、B2、B3 或“生产”类别中的任何其他层。 有关更多选项,请选择“查看其他选项”。
完成后,选择“应用”。
出现以下消息时,表示缩放操作已完成。
确保自定义域的安全
执行以下步骤:
在 Azure 门户的左侧菜单中,选择“应用程序服务”>“<app-name>”。
在应用的左侧导航窗格中,通过以下方式启动“TLS/SSL 绑定”对话框:
- 选择“自定义域”>“添加绑定”
- 选择“TLS/SSL 设置”>“添加 TLS/SSL 绑定”
在“自定义域”中,选择要添加绑定的自定义域。
如果应用已具有所选自定义域的证书,请直接转到创建绑定。 反之,请继续操作。
为自定义域添加证书
如果应用不具有所选自定义域的证书,则有以下两种选择:
创建绑定
根据下表的要求在“TLS/SSL 绑定”对话框中配置 TLS 绑定,然后单击“添加绑定” 。
设置 | 说明 |
---|---|
自定义域 | 要为其添加 TLS/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>
以核实其是否适合应用。
应用程序代码可以通过“x-appservice-proto”标头检查协议。 该标头的值将为 http
或 https
。
注意
如果应用显示证书验证错误,可能是因为使用自签名证书。
如果不是这样,可能是在将证书导出为 PFX 文件时遗漏了中间证书。
防止 IP 更改
在删除某个绑定时,即使该绑定是 IP SSL,入站 IP 地址也可能会更改。 在续订已进行 IP SSL 绑定的证书时,了解这一点尤为重要。 若要避免应用的 IP 地址更改,请按顺序执行以下步骤:
- 上传新证书。
- 将新证书绑定到所需的自定义域,不要删除旧证书。 此操作替换而不是删除旧的绑定。
- 删除旧证书。
实施 HTTPS
在应用页的左侧导航窗格中,选择“TLS/SSL 设置”。 然后,在“仅 HTTPS”中,选择“启用”。
如果在“仅 HTTPS”中选择了“关”,这意味着所有人都仍然可以使用 HTTP 访问你的应用。 可以通过选择“开”将所有 HTTP 请求重定向到 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 版本的所有连接。
处理 TLS 终止
在应用服务中,TLS 终止在网络负载均衡器上发生,因此,所有 HTTPS 请求将以未加密的 HTTP 请求形式访问你的应用。 如果应用逻辑需要检查用户请求是否已加密,可以检查 X-Forwarded-Proto
标头。
特定于语言的配置指南,如 Linux Node.js 配置指南,介绍如何在应用程序代码中检测 HTTPS 会话。
使用脚本自动化
Azure CLI
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 /app-service/app-service-web-tutorial-custom-domain#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