首页 > 解决方案 > 从脚本更新 Azure CDN 自定义域证书

问题描述

如何触发 Azure CDN 从 Key Store 读取最新版本的自定义证书而无需停机?

我的 CDN 设置工作正常,但鉴于 Let's Encrypt,证书寿命很短,需要自动化更新。在Azure az keyvault certificate importCLI 上将证书更新到 Key Vault 是很简单的事情,但接下来呢?你如何告诉 Azure CDN 开始使用新版本的证书?

失败的尝试

从 Azure 门户

自定义域证书版本上的 Azure 门户工具提示显示“选择要使用的证书版本。默认情况下,我们将使用最新版本。 ”创建端点时确实如此,但是如何开始使用最新版本?最新版本已从下拉列表中选择,但我确实选择了以前的版本并选择了最新版本。这样做启用了“保存”。

保存表格导致证书的无停机更新。很好,但考虑到自动化和脚本,并不是真正的路要走。

可能有用的东西,但我还没有测试过

有什么我可以在下一个更新周期尝试的吗?

标签: azureazure-powershellazure-cliazure-cdn

解决方案


从 2021 年 4 月 5 日起,可以告知 Azure CDN 使用特定 KeyVault 证书的“最新”版本。我还没有发现任何有关此更改的消息,但它已通过此提交添加到文档中。

为了在 Key Vault 中提供更新版本的证书时自动将证书轮换到最新版本,请将证书/机密版本设置为“最新”。如果选择了特定版本,您必须手动重新选择新版本以进行证书轮换。部署新版本的证书/密钥最多需要 24 小时。

在门户中,这可以通过在“证书/机密版本”下拉列表中选择“最新”选项来完成。使用 Azure CLI,可以通过以下方式完成:

az cdn custom-domain enable-https \
    --resource-group "$cdnResourceGroupName" \
    --profile-name "$cdnProfileName" \
    --endpoint-name "$cdnEndpointName" \
    --name "$cdnCustomDomainName" \
    --user-cert-subscription-id "$subscriptionId" \
    --user-cert-group-name "$keyVaultResourceGroupName" \
    --user-cert-vault-name "$keyVaultName" \
    --user-cert-secret-name "$secretName" \
    --user-cert-protocol-type 'sni'

请注意,此命令不会设置参数--user-cert-secret-version,这是您选择“最新”功能的方式。

对于想要手动执行此操作的任何人,手动执行此操作的旧答案如下。


az cdn custom-domain enable-https在已启用 HTTPS 的域上运行。结果:内部错误配置和几个小时的停机时间首先禁用自定义域然后启用它。

从 2021 年 4 月 5 日起,这可以使用 Azure CLI 完成:

az cdn custom-domain enable-https \
    --resource-group "$cdnResourceGroupName" \
    --profile-name "$cdnProfileName" \
    --endpoint-name "$cdnEndpointName" \
    --name "$cdnCustomDomainName" \
    --user-cert-subscription-id "$subscriptionId" \
    --user-cert-group-name "$keyVaultResourceGroupName" \
    --user-cert-vault-name "$keyVaultName" \
    --user-cert-secret-name "$secretName" \
    --user-cert-secret-version "$secretVersion" \
    --user-cert-protocol-type 'sni'

(最初在 2019 年 5 月编写此答案时,Azure CLI 记录了一个--custom-domain-https-parameters参数,暗示它可以用于此目的。如果未提供该参数,CLI 将运行 CDN 管理的证书工作流(由 DigiCert 颁发的证书) . 但是,从未正确记录如何实际使用该参数。截至 2021 年 3 月,该参数再次从 CLI 中删除。最后,截至 2021 年 4 月,--user-cert-*已添加该参数。)

等效功能于 2019 年 3 月添加到.Net SDK、.Net SDK 中。所以Nuget 包应该允许你使用用户管理的证书。

截至 2021 年 4 月,Azure PowerShell 的Enable-AzCdnCustomDomainHttps命令行开关仍不支持用户管理的证书,仅支持 CDN 管理的证书。

或者,您可以直接使用此处记录的 REST API。向一个看起来像的身体发出POST请求https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Cdn/profiles/$cdnProfileName/endpoints/$cdnEndpointName/customDomains/$cdnCustomDomainName/enableCustomHttps?api-version=2018-04-02application/json

{
    "certificateSource": "AzureKeyVault",
    "certificateSourceParameters": {
        "@odata.type": "#Microsoft.Azure.Cdn.Models.KeyVaultCertificateSourceParameters",
        "deleteRule": "NoAction",
        "resourceGroupName": "$resourceGroupName",
        "secretName": "$secretName",
        "secretVersion": "$secretVersion",
        "subscriptionId": "$subscriptionId",
        "updateRule": "NoAction",
        "vaultName": "$keyVaultName"
    },
    "protocolType": "ServerNameIndication"
}

$resourceGroupName$keyVaultName识别 KeyVault。$secretName$secretVersion识别证书。(如果门户没有在您的 KeyVault 中显示任何机密,请不要混淆;带有私钥的 KeyVault 证书隐含地是具有相同名称和版本的 KeyVault 机密。)

这个 API 端点遵循标准 REST 语义,HTTP 202 Accepted因为它是一个长时间运行的异步操作,所以它会返回。它将Location在响应中设置标头,并且您应该GET重复该 URL,直到它解析为成功或失败状态代码。

请注意,门户还使用 REST API,因此您始终可以通过在门户 UI 中执行这些步骤并在浏览器的开发人员工具中检查网络请求来获得这一点。不过,您将需要获得自己的 oauth2 令牌(通过创建 SP)。


另外:为了节省人们在尝试为我自己的域执行此操作时发现这一点所花费的时间,请不要被文档或Azure Rest API 规范存储库中的示例所迷惑。它们暗示 API 版本2017-10-12支持customHttpsParameters,但实际上只有2018-04-02和更新的版本支持它。如果您使用2017-10-12,则该参数将被静默忽略,它将尝试使用 Digicert 自动证书工作流程。


推荐阅读