azure - 从脚本更新 Azure CDN 自定义域证书
问题描述
如何触发 Azure CDN 从 Key Store 读取最新版本的自定义证书而无需停机?
我的 CDN 设置工作正常,但鉴于 Let's Encrypt,证书寿命很短,需要自动化更新。在Azure az keyvault certificate import
CLI 上将证书更新到 Key Vault 是很简单的事情,但接下来呢?你如何告诉 Azure CDN 开始使用新版本的证书?
失败的尝试
- 等了几个小时。没啥事儿。
az cdn custom-domain enable-https
在已启用 HTTPS 的域上运行。结果:内部错误配置和几个小时的停机时间首先禁用自定义域然后启用它。不过,证书已更新。
从 Azure 门户
自定义域证书版本上的 Azure 门户工具提示显示“选择要使用的证书版本。默认情况下,我们将使用最新版本。 ”创建端点时确实如此,但是如何开始使用最新版本?最新版本已从下拉列表中选择,但我确实选择了以前的版本并选择了最新版本。这样做启用了“保存”。
保存表格导致证书的无停机更新。很好,但考虑到自动化和脚本,并不是真正的路要走。
可能有用的东西,但我还没有测试过
- 应用 CDN 设置的 ARM 模板
- Powershell Az.Cdn有
Start-AzCdnEndpoint
/Stop-AzCdnEndpoint
cmdlet。也许有帮助,但 100% 保证会产生停机时间。
有什么我可以在下一个更新周期尝试的吗?
解决方案
从 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-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"
}
$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 自动证书工作流程。
推荐阅读
- python - 为什么在自定义迭代器中返回 self ?
- r - 如何将结构化 XML 数据加载到 R 中?
- armeria - Armeria grpc 客户端:如何为不同的 grpc 方法设置不同的重试行为
- swift - 在所有其他 Struct Swift 中更新对象
- typescript - 有人可以告诉我返回泛型类型 T 和未定义是否可以接受?
- python - 如何在列表中查找彼此相距 1000 以内的值(python)
- sql - 两个日期之间的 SQL 检查不返回任何结果
- javascript - 将 dotenv 与 react 和 webpack 一起使用
- ssh - 从 SSH 会话中分离命令
- sql-server - 如何通过 Plesk 将我的 script.sql 文件和我的数据库文件上传到 GoDaddy?