首页 > 解决方案 > 从 ARM 模板中的 Azure 密钥保管库获取最新版本的证书

问题描述

创建需要安装 SSL 证书的 ARM 模板,该证书位于 Azure 密钥保管库内。如果我用指纹指定证书,它可以正常工作:

https://contoso.vault.azure.net/secrets/web01-test-contoso-com/968bf207451149d3aceb390065af9d3a

但由于证书在滴答作响,这会将可能过时的依赖项硬编码到 ARM 模板中。我宁愿只指定最新版本(就像它在门户中显示的那样)。但是,我还没有找到任何说明如何做到这一点的文档,甚至没有提到是否有可能。

我使用以下方法进行了几个实验:

https://contoso.vault.azure.net/secrets/web01-test-contoso-com

https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest

但是在这两种情况下,我都收到了相同的错误消息:

message '{
   "error": {
     "code": "InvalidParameter",
     "message": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest is 
 not a valid versioned Key Vault Secret URL. It should be in the format 
 https://<vaultEndpoint>/secrets/<secretName>/<secretVersion>.",
     "target": "certificateUrl"
   }
}'

所以我的问题是:如何以获取最新版本的方式引用证书?

为清楚起见,我在secretsVM 的 ARM 模板部分中使用 URL,如下所示,它从 Azure 密钥库获取证书并将其安装到 Windows 证书存储中。

"secrets": [
    {
      "sourceVault": {
        "id": "[resourceId(parameters('keyVaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('keyVaultName'))]"
      },
      "vaultCertificates": [
        {
          "certificateUrl": "https://contoso.vault.azure.net/secrets/web01-test-contoso-com/latest",
          "certificateStore": "My"
        }
      ]
    }
]

注意:我觉得奇怪的是,您可以指定要安装的操作系统的最新版本,但您不能指定安装最新版本的证书。

标签: azureazure-resource-managerazure-keyvaultarm-templateazure-template

解决方案


这是可能的,与公认的答案相反。像这样使用秘密的资源 id 定义变量,例如:

"mySecretResourceId": "[concat(resourceGroup().id,'/providers/Microsoft.KeyVault/vaults/', variables('keyVaultName'), '/secrets/', 'my-secret-name')]"

然后你可以在你的模板中使用它,如下所示:

"certificateUrl": "[reference(variables('mySecretResourceId'), '2018-02-14').secretUriWithVersion]"

推荐阅读