在 Azure 中启用 HTTPS 通信云服务 (扩展支持)
使用超文本传输协议安全 (HTTPS) 协议与Microsoft Azure 云服务 (扩展支持) 进行通信。 本文讨论如何为云服务 (扩展支持) 启用 HTTPS 通信。
先决条件
项目部署的常规步骤
将云服务 (扩展支持) 项目部署到 Azure 的常规步骤如下:
准备证书。
配置项目。
将项目文件打包到云服务的服务定义 (.csdef) 、服务配置 (.cscfg) 和服务包 (.cspkg) 文件中。
如有必要,请更改云服务 (扩展支持) 资源的配置。 例如,可以进行以下任何修改:
- 更新包 URL。
- 配置 URL 设置。
- 更新操作系统机密设置。
将新项目部署和更新到 Azure。
注意
可以通过多种不同的方法部署项目,例如使用以下工具:
无论部署方法如何,常规部署步骤都是相同的。
这些步骤中的前两个是所有部署方法所必需的。 代码 更改 部分介绍了这些步骤。 其余步骤也很重要,但它们并不总是需要手动用户干预。 例如,这些步骤可能由 Visual Studio 等工具自动完成。 其中最后三个步骤将在 配置更改 部分讨论。
代码更改
若要更改代码以准备证书并配置项目,请执行以下步骤:
按照说明通过步骤 6 将证书上传到密钥保管库 。
(40 位十六进制字符串) 记下证书的指纹。
在项目的 服务配置 (.cscfg) 文件中 ,将证书指纹添加到要使用证书的角色。 例如,如果要使用证书作为 SSL 证书来与 WebRole 通信,则可以添加类似于以下 代码片段的 WebRole1
XML 代码作为根 ServiceConfiguration
元素的第一个子元素:
<Role name="WebRole1">
<Instances count="1" />
<Certificates>
<Certificate
name="Certificate1"
thumbprint="0123456789ABCDEF0123456789ABCDEF01234567"
thumbprintAlgorithm="sha1"
/>
</Certificates>
</Role>
可以自定义证书的名称,但它必须与服务定义 (.csdef) 文件中使用的证书名称匹配。
在 服务定义 (.csdef) 文件中,添加以下元素。
父 XPath |
要添加的元素 |
要使用的属性 |
/ServiceDefinition/WebRole/Sites/Site/Bindings |
Binding |
name、 endpointName |
/ServiceDefinition/WebRole/Endpoints |
InputEndpoint |
名称、 协议、 端口、 证书 |
/ServiceDefinition/WebRole |
Certificates/Certificate |
name、 storeLocation、 storeName、 permissionLevel |
元素 Certificates
必须直接添加到结束 Endpoints
标记之后。 它不包含任何属性。 它仅包含子 Certificate
元素。
例如,服务定义文件可能类似于以下 XML 代码:
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="CSESOneWebRoleHTTPS" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2015-04.2.6">
<WebRole name="WebRole1" vmsize="Standard_D1_v2">
<Sites>
<Site name="Web">
<Bindings>
<Binding name="Endpoint1" endpointName="Endpoint1" />
<Binding name="HttpsIn" endpointName="HttpsIn" />
</Bindings>
</Site>
</Sites>
<Endpoints>
<InputEndpoint name="Endpoint1" protocol="http" port="80" />
<InputEndpoint name="HttpsIn" protocol="https" port="443" certificate="Certificate1" />
</Endpoints>
<Certificates>
<Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" permissionLevel="limitedOrElevated" />
</Certificates>
</WebRole>
</ServiceDefinition>
在此示例中,服务定义文件已修改为端口 443 上的 HTTPS 协议绑定 的 HttpsIn
输入终结点。
Certificate1
它将证书用于名称为 且位置LocalMachine
仅为有限权限级别或提升权限级别的存储My
。 和 Certificate
元素中的InputEndpoint
证书名称相互匹配。 它们还与上一步中的服务配置 (.cscfg) 文件中使用的证书名称匹配。
配置更改
更改云服务配置的说明因云服务的部署方式而异。 这些说明显示在以下选项卡上。 每个选项卡表示不同的部署方法。
在继续之前,请参阅使用 Azure 门户部署 Azure 云服务 (扩展支持) 。 然后,按照以下步骤通过Azure 门户进行正确的配置更改:
转到标题为“ 使用 ARM 模板手动从经典云服务迁移到云服务扩展支持”的博客文章,并按照步骤 7 到 9 进行操作。 这些说明演示如何执行以下步骤:
在Azure 门户,返回到云服务的“概述”页,然后选择“更新”。
在 “更新云服务 ”页上,在“ 基本信息 ”选项卡上进行以下更改:
在 “包/配置/服务定义位置 ”字段中,选择“ 从 blob”。
在 “上传包 (.cspkg”.zip) 字段中,执行以下步骤:
- 选择“ 浏览” 链接。
- 选择将文件上传到的存储帐户和容器。
- 在容器页中,选择相应的文件 (在本例中为 <project-name.cspkg>) ,然后选择“选择”按钮。
对于 “上传配置 (.cscfg) ”字段 (和 ServiceConfiguration.Cloud.cscfg 文件) ,请重复上一步中概述的子过程。
对于 “上传服务定义 (.csdef) 字段 (和 ServiceDefinition.csdef 文件) ,请再次重复子过程。
选择“ 配置 ”选项卡。
在 “密钥保管库 ”字段中,选择之前) “代码更改 ”部分 (上传证书的密钥保管库。 在所选密钥保管库中找到证书后,列出的证书将显示“已找到状态”。
若要部署新配置的项目,请选择“ 更新 ”按钮。
在继续之前,请参阅使用 Azure PowerShell 部署云服务 (扩展支持) 。 然后,按照以下步骤通过 PowerShell 脚本进行配置更改:
转到标题为“ 使用 ARM 模板手动从经典云服务迁移到云服务扩展支持”的博客文章,并按照步骤 7 到 9 进行操作。 这些说明演示如何执行以下步骤:
通过运行 Connect-AzAccount cmdlet 登录到 Azure。
在以下 PowerShell 脚本中,将脚本开头的占位符替换为每个变量的实际值,然后运行脚本来更新云服务:
# Enter values for placeholders in the following variables.
$vaultName = "<key-vault-resource-name>"
$resourceGroupKeyVault = "<resource-group-name-where-key-vault-is-deployed>"
$certificateName = "<name-of-certificate-saved-in-key-vault>"
$cloudService = @{
Name = "<name-of-cloud-service>"
ResourceGroupName = "<resource-group-name-where-cloud-service-is-deployed>"
SubscriptionId = "<subscription-guid>"
}
$cscfgFilePath = "<local-path-to-your-service-configuration-file-cscfg>"
$cspkgUrl = "<sas-token-url-of-the-service-package-file-cspkg>"
# Code execution
$keyVault = Get-AzKeyVault -VaultName $vaultName -ResourceGroupName $resourceGroupKeyVault
$certificate = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName
$vaultSecretGroupObject = @{
CertificateUrl = $certificate.SecretId
Id = $keyVault.ResourceId
}
$secretGroup = New-AzCloudServiceVaultSecretGroupObject @vaultSecretGroupObject
$osProfile = @{secret = @($secretGroup)}
$cses = Get-AzCloudService @cloudService
$cses.Configuration = Get-Content $cscfgFilePath | Out-String
$cses.PackageUrl = $cspkgUrl
$cses.OSProfile = $osProfile
$cses | Update-AzCloudService
在继续之前,请参阅 使用 ARM 模板部署云服务 (扩展支持) 。 然后,按照以下步骤配置 ARM 模板:
转到标题为“ 使用 ARM 模板手动从经典云服务迁移到云服务扩展支持”的博客文章,并按照步骤 7 到 10 进行操作。 这些说明演示如何执行以下步骤:
在云服务的原始 ARM 模板中,找到 osProfile
属性。 如果原始云服务项目仅支持 HTTP 通信,则 osProfile
属性为空, ("osProfile": {}
) 。 若要使云服务能够从正确的密钥保管库检索正确的证书,请指定要在 ARM 模板中使用的密钥保管库。 可以使用 参数来表示此值。 或者,可以将值硬编码到 ARM 模板中,如以下示例所示:
"osProfile": {
"secrets": [
{
"sourceVault": {
"id": "/subscriptions/88889999-aaaa-bbbb-cccc-ddddeeeeffff/resourceGroups/cstocses/providers/Microsoft.KeyVault/vaults/cstocses"
},
"vaultCertificates": [
{
"certificateUrl": "https://cstocses.vault.azure.net/secrets/csescert/0123456789abcdef0123456789abcdef"
}
]
}
]
}
在 ARM 模板的 JSON 文本中id
,参数中的sourceVault
值是Azure 门户中密钥保管库页 URL 的一部分。 该值 certificateUrl
是之前找到的密钥保管库证书 URL。 下表显示了这些值的文本格式。
参数 |
格式 |
源保管库 ID |
/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name> |
Key Vault 证书 URL |
https://<key-vault-name>.vault.azure.net/secrets/<certificate-name>/<certificate-secret> |
部署包含新参数的更新 ARM 模板,例如包 SAS 令牌、配置 SAS 令牌等。 若要查看如何声明和指定这些参数,可以查看 一个示例 ARM 模板文件和 一个 示例 ARM 模板参数文件。 然后,等待部署完成。
注意
如果收到一条错误消息,指出正在使用公共 IP 地址,请从服务配置中删除公共 IP 地址 (.cscfg) 文件和 ARM 模板参数文件。 不要从 ARM 模板文件本身中删除公共 IP 地址声明。
在继续之前,请参阅使用 Azure SDK 部署云服务 (扩展支持) 。
本部分介绍如何使用 Azure SDK 和 C# 进行正确的配置更改。 若要成功使用 SDK 部署云服务项目并修改相关配置,应在 Microsoft Entra ID 中注册应用程序。 若要进行注册,请参阅使用门户创建可以访问资源的Microsoft Entra应用程序和服务主体一文。 下表概述了要采取的具体步骤以及该文章中要阅读的相应小节。
按照以下步骤进行正确的配置更改:
转到标题为“ 使用 ARM 模板手动从经典云服务迁移到云服务扩展支持 ”的博客文章,并按照步骤 7 到 10 进行操作。 这些说明演示如何执行以下步骤:
(压缩的存档文件) 下载 示例项目 ,并提取其内容。
在文本编辑器中打开 SDKSample\CreateCloudService\CreateCloudService\LoginHelper.cs 文件。
InitializeServiceClient
在 方法中tenantId
,分别使用租户 ID、应用程序 ID 和clientCredentials
应用程序机密的值覆盖 、 clientId
和 字符串变量的值。 这些值是注册应用程序时复制的值。
在文本编辑器中打开 SDKSample\CreateCloudService\CreateCloudService\Program.cs 文件。 在 方法中 Main
,覆盖在方法开头声明的变量的某些初始化值。 下表显示了变量名称以及必须用于它们的值。
变量名称 |
新值 |
m_subId |
包含云服务的订阅的 ID |
csrgName |
包含云服务的资源组的名称 |
csName |
云服务资源名称 |
kvrgName |
包含密钥保管库资源的资源组的名称 |
kvName |
密钥保管库资源名称 |
kvsubid |
包含密钥保管库的订阅的 ID (这可能不同于云服务订阅 ID) |
secretidentifier |
密钥保管库证书 URL |
filename |
服务配置文件的本地路径 (ServiceConfiguration.Cloud.cscfg) |
packageurl |
服务包文件的 SAS URL (<project-name.cspkg>) |
在“Visual Studio 解决方案资源管理器”窗格中,右键单击项目节点,然后选择“管理 NuGet 包”。 在“ 浏览 ”选项卡上,搜索、选择并安装以下包:
Microsoft.Azure.Management.ResourceManager
Microsoft.Azure.Management.Compute
Microsoft.Azure.Management.Storage
Azure.Identity
Microsoft.Rest.ClientRuntime.Azure.Authentication
运行项目,然后等待消息显示在“ 输出 ”窗格中。 如果窗格显示“使用代码 0 退出”,则更新和部署应成功运行。 如果显示“使用代码 1 退出”,则可能需要检查错误消息才能查看任何问题。
在继续之前,请参阅在 Visual Studio 中创建和部署到云服务 (扩展支持) 。
在 Visual Studio 中,必须进行两个配置更改。 设置服务配置,使本地上下文与云上下文保持一致,然后指定密钥保管库所在的位置。
对于服务配置,请将云上下文的内容 (ServiceConfiguration.Cloud.cscfg 文件) 复制,并将其粘贴到 serviceConfiguration.Local.cscfg 文件) (本地上下文中。 是否具有不同的配置,或者是否仍需要本地配置文件用于其他用途? 如果任一条件为 true,请 certificate
保留现有本地上下文中的元素。
在“Visual Studio 解决方案资源管理器”窗格中,右键单击项目节点,然后选择“发布”。 继续执行发布Azure 应用程序向导,直到到达“设置”选项卡。在该选项卡上,将“密钥保管库”字段设置为保存密钥保管库的位置。 最后,选择“ 发布 ”按钮,然后等待部署完成。
更改配置后,客户将能够使用 HTTPS 协议与云服务网站通信。 如果证书是自签名的,浏览器可能会报告证书不安全的警告,但浏览器不会阻止连接。
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。