在 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
证书作为存储区, My
该存储的名称和位置 LocalMachine
仅为有限权限级别或提升的权限级别。 元素InputEndpoint
Certificate
中的证书名称彼此匹配。 它们还与上一步的服务配置 (.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 进行操作。 这些说明演示如何执行以下步骤:
打包项目。
将生成的服务包(<project-name.cspkg>)和云服务配置(ServiceConfiguration.Cloud.cscfg)文件上传到云服务的存储帐户容器中。
为每个上传的文件生成共享访问签名 (SAS) URL。
从Azure 门户中的密钥保管库证书页获取以下值:
- Key Vault 证书 URL
- 订阅 ID
- 在其中部署密钥保管库的资源组的名称
- 密钥保管库的服务名称
在云服务的原始 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 地址,请从服务配置 (.cscfg) 文件和 ARM 模板参数文件中删除公共 IP 地址。 请勿从 ARM 模板文件本身中删除公共 IP 地址声明。
在继续操作之前,请参阅使用 Azure SDK 部署云服务(扩展支持)。
注意
本部分包含从官方 SDK 示例代码重写的代码,可在 Azure 云服务(扩展支持)的 GitHub 示例代码页中找到这些代码。
本部分介绍如何使用 Azure SDK 和 C# 进行正确的配置更改。 若要成功使用 SDK 部署云服务项目并修改相关配置,应在 Microsoft Entra ID 中注册应用程序。 若要执行注册,请参阅使用 门户创建可访问资源 文章的 Microsoft Entra 应用程序和服务主体。 下表概述了要执行的具体步骤以及本文中要阅读的相应子部分。
按照以下步骤进行正确的配置更改:
转到标题为 手动从经典云服务迁移到使用 ARM 模板 的云服务扩展支持的博客条目,并遵循步骤 7 到 10。 这些说明演示如何执行以下步骤:
打包项目。
将生成的服务包(<project-name.cspkg>)文件上传到云服务的存储帐户容器中。
注意
尽管说明中介绍了哪些内容,但无需上传云服务配置(ServiceConfiguration.Cloud.cscfg)文件。 只需在此处上传服务包文件。
为上传的服务包文件生成共享访问签名 (SAS) URL。
从Azure 门户中的密钥保管库证书页获取以下值:
- Key Vault 证书 URL
- 订阅 ID
- 在其中部署密钥保管库的资源组的名称
- 密钥保管库的服务名称
下载示例项目(压缩的存档文件),并提取其内容。
在 文本编辑器中打开 SDKSample\CreateCloudService\CreateCloudService\LoginHelper.cs 文件。 在方法中InitializeServiceClient
,分别使用租户 ID、应用程序 ID 和clientCredentials
应用程序机密的值覆盖tenantId
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 反馈社区。