您如何触发Azure CDN来不停机地从密钥商店读取最新版本的自定义证书?
我的CDN-设置正常,但如果我们加密,证书是短暂的,需要自动化的更新。在Azure上执行az keyvault certificate import非常简单,可以将证书更新到密钥库中,但是接下来怎么办?如何告诉Azure CDN开始使用证书的新版本?
失败尝试
az cdn custom-domain enable-https。结果:一个内部错误配置和几个小时的停机时间,首先禁用自定义域,然后启用它。不过,证书已经更新。来自Azure门户
自定义域证书版本上的Azure Portal工具提示说:“选择要使用的证书版本。默认情况下,我们将使用最新版本。”在创建端点时是这样的,但是如何开始使用最新版本呢?最新版本已经从下拉列表中选择,但我确实选择了前一个版本并选择了最新版本。这样做可以使“保存”。
保存表单会导致证书没有停机更新。不错,但考虑到自动化和脚本编写,这并不是真正可行的方法。
可能会起作用的东西,但我还没试过
Start-AzCdnEndpoint/Stop-AzCdnEndpoint cmdlet。也许有帮助,但100%保证产生停机时间。在下一个更新周期有什么可以试用的吗?
发布于 2019-05-15 11:12:05
从2021-04-05开始,可以告诉Azure使用特定KeyVault证书的“最新”版本。我还没有发现任何关于这个变化的消息,但是它是添加到文献资料和这个承诺。中的
为了使证书在密钥库中可用时自动转到最新版本,请将证书/秘密版本设置为“最新版本”。如果选择了特定版本,则必须手动重新选择新版本以进行证书轮换。部署新版本的证书/机密需要最多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参数,这是您选择“最新”功能的方式。
对于任何想要手动执行此操作的人,手动执行此操作的旧答案如下。
在已启用HTTPS的域上运行
az cdn custom-domain enable-https。结果:一个内部错误配置和几个小时的停机时间,首先禁用自定义域,然后启用它。
从2021-04-05开始,可以使用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记录了一个--custom-domain-https-parameters参数,这意味着它可以用于此目的。如果未提供该参数,则CLI将运行CDN管理的证书工作流(由DigiCert颁发的证书)。但是,从来没有正确地记录过如何实际使用该参数。截至2021年3月,该参数再次从CLI中删除。最后,截至2021年4月,添加了--user-cert-*参数。)
同样的特性是在2019年3月添加到.Net SDK,的。因此,Nuget套餐应该允许您使用用户管理的证书。
截至2021年4月,司令官仍然不支持用户管理的证书,只支持CDN管理的证书.
或者您可以将REST直接作为文档化的这里。使用,向https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Cdn/profiles/$cdnProfileName/endpoints/$cdnEndpointName/customDomains/$cdnCustomDomainName/enableCustomHttps?api-version=2018-04-02发出一个POST请求,其中的application/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,直到它解析为成功或失败状态代码为止。
请注意,门户也使用REST,因此您始终可以通过在门户UI中执行步骤并在浏览器的开发人员工具中检查网络请求来获得这一点。但是,您需要获得自己的oauth2令牌(通过创建一个SP)。
旁白:为了节省我为自己的领域尝试这样做所花费的时间,不要被文档或Azure Rest规范中的示例repo。所愚弄--它们暗示API版本2017-10-12支持customHttpsParameters,但实际上只有2018-04-02和更新版本支持它。如果使用2017-10-12,则该参数将被忽略,并且它将尝试使用Digicert自动证书工作流。
发布于 2019-06-18 19:21:14
正如@Ar导航所建议的,Azure CDN自定义域REST API调用可用于触发Azure CDN中现有自定义域使用的证书的更新。建议的API文档位于https://learn.microsoft.com/en-us/rest/api/cdn/customdomains/enablecustomhttps。当将上述示例与API参考信息相结合时,可以使用PowerShell 6 Invoke-RestMethod创建合适的请求。成功后,CDN将在几分钟内开始更新密钥库到端点的证书。
这次行动不涉及任何诡计。所需要的就是收集API所需的UserManagedHttpsParameters的所有所需的五个参数,以指示CDN中的确切自定义域,并在密钥库中精确地找到X.509证书。还需要的是将参数与有效的承载令牌组合起来,然后进行上述API调用,通知CDN从密钥库获取新证书,并将其部署到所有CDN端点。
我的脚本可以在https://gist.github.com/HQJaTu/c5695626ba51c6194845fa60913e911b上使用
如何将新证书输入密钥库是另一个讨论,而我的脚本不会解决这个问题。然而,上传证书的新版本要比触发CDN更新容易得多.
https://stackoverflow.com/questions/55666931
复制相似问题