通过脚本更新Azure CDN自定义域证书

时间:2019-04-13 15:11:04

标签: azure azure-powershell azure-cli azure-cdn

如何触发Azure CDN从密钥库中读取最新版本的自定义证书,而无需停机?

我的CDN设置工作正常,但考虑到“让我们加密”,该证书寿命很短,并且需要自动进行更新。在Azure CLI上进行az keyvault certificate import的琐事足以将证书更新到Key Vault中,但是接下来呢?您如何告诉Azure CDN开始使用新版本的证书?

尝试失败

  • 等待几个小时。什么都没发生。
  • 在已启用HTTPS的域上运行az cdn custom-domain enable-https。结果:内部错误配置和几个小时的停机时间,以首先禁用自定义域,然后再启用它。证书已更新。

从Azure门户

自定义域证书版本上的

Azure Portal工具提示说:“ 选择要使用的证书版本。默认情况下,我们将使用最新版本。”。在创建端点时,确实如此,但是如何开始使用最新版本?已经从下拉菜单中选择了最新版本,但是我确实选择了先前版本并选择了最新版本。这样可以启用“保存”。

保存该表单不会导致证书的停机时间更新。不错,但是考虑到自动化和脚本编写,并不是真正的方法。

可能会解决问题的方法,但我尚未测试

  • 应用CDN设置的ARM模板
  • Powershell Az.Cdn具有Start-AzCdnEndpoint / Stop-AzCdnEndpoint cmdlet。也许有帮助,但是100%保证会导致停机。

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

3 个答案:

答案 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,这是我为自己的域所做的。 enableCustomHttpsPOST,其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

上找到它