如何触发Azure CDN从密钥库中读取最新版本的自定义证书,而无需停机?
我的CDN设置工作正常,但考虑到“让我们加密”,该证书寿命很短,并且需要自动进行更新。在Azure CLI上进行az keyvault certificate import
的琐事足以将证书更新到Key Vault中,但是接下来呢?您如何告诉Azure CDN开始使用新版本的证书?
az cdn custom-domain enable-https
。结果:内部错误配置和几个小时的停机时间,以首先禁用自定义域,然后再启用它。证书已更新。自定义域证书版本上的
Azure Portal工具提示说:“ 选择要使用的证书版本。默认情况下,我们将使用最新版本。”。在创建端点时,确实如此,但是如何开始使用最新版本?已经从下拉菜单中选择了最新版本,但是我确实选择了先前版本并选择了最新版本。这样可以启用“保存”。
保存该表单不会导致证书的停机时间更新。不错,但是考虑到自动化和脚本编写,并不是真正的方法。
Start-AzCdnEndpoint
/ Stop-AzCdnEndpoint
cmdlet。也许有帮助,但是100%保证会导致停机。在下一个更新周期有什么可以尝试的吗?
答案 0 :(得分:0)
在已启用HTTPS的域上运行
az cdn custom-domain enable-https
。结果:内部错误配置和几个小时的停机时间,以先禁用自定义域然后再启用它。
如果您的意思是az cdn custom-domain enable-https
是在没有the --custom-domain-https-parameters
flag,的情况下完成的,那么我相信这可以告诉它开始遵循Digicert自动证书工作流程。至少那是我尝试使用它对我的域所做的。
FWIW,尽管文档中有说明,但即使最新版本的az
也无法识别该标志(azure-cli (2.0.57)
+ cdn (0.2.0)
,这是您刚从{{ 1}}容器)。我不确定文档从哪里得到。它可能实际上不存在。
它是2个月前添加到the .Net SDK,的,但尚未添加到Azure PowerShell's Enable-AzCdnCustomDomainHttps
中。我想它可能很快就会进入PS。
保存该表单不会导致证书的停机时间更新。不错,但是考虑到自动化和脚本编写,并不是真正的方法。
您可以使用支持azuresdk/azure-cli-python:latest
端点的CustomDomainHttpsParameters
的SDK之一,例如我上面所说的.Net SDK。
或者您可以直接使用REST API,这是我为自己的域所做的。 enableCustomHttps
至POST
,其https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Cdn/profiles/$cdnProfileName/endpoints/$cdnEndpointName/customDomains/$cdnCustomDomainName/enableCustomHttps?api-version=2018-04-02
主体看起来像
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"
}
会有所不同。
它遵循标准的REST语义,因为它是长时间运行的异步操作,所以它返回$secretVersion
。它将在响应中设置HTTP 202 Accepted
标头,并且您应该反复Location
将该URL解析为成功或失败状态代码。
请注意,门户网站也使用REST API,因此您始终可以仅通过执行门户网站UI中的步骤并在浏览器的开发人员工具中检查网络请求来派生此内容。不过,您将需要获得自己的oauth2令牌(通过创建SP)。
此外:为节省人们在尝试针对自己的域进行此操作时发现我所花的时间,请不要被Azure Rest API specs repo.中的示例所迷惑。该示例暗含API版本{{1} }支持GET
,但实际上只有2017-10-12
及更高版本支持它。如果使用customHttpsParameters
,则该参数将被静默忽略,它将尝试使用Digicert自动证书工作流程。
答案 1 :(得分:0)
如@Arnavion所建议,Azure CDN自定义域REST API调用可用于触发Azure CDN中现有自定义域使用的证书的更新。建议的API文档位于https://docs.microsoft.com/en-us/rest/api/cdn/customdomains/enablecustomhttps。将以上示例与API参考信息结合使用时,可以使用PowerShell 6 Invoke-RestMethod
来制定适当的请求。成功后,CDN将在几分钟内开始将证书从Key Vault更新到端点。
该操作不涉及任何欺骗。所需要做的就是收集API必需的 UserManagedHttpsParameters 所需的所有五个参数,以指示CDN中的确切自定义域,并将X.509证书精确定位到Key Vault。还需要将参数与有效的承载令牌结合起来,然后进行上述API调用,以通知CDN从Key Vault提取新证书并将其部署到所有CDN端点。
我的脚本可以在https://gist.github.com/HQJaTu/c5695626ba51c6194845fa60913e911b
处获得。如何将新证书放入Key Vault是另一回事,我的脚本无法解决。但是,上传新版本的证书比触发CDN更新要容易得多。
答案 2 :(得分:0)
目前,Azure CLI的文档仍未给出解决方法。 我已经编写了一些python脚本来作为acme.sh renew-hook的一部分。 它主要适用于apex自定义域,但您可以将其与子域一起使用。 您可以在github-> https://github.com/przemika/azure-byoc-for-custom-domain
上找到它