【问题标题】:Get the latest version of a certificate from an Azure key vault in an ARM template从 ARM 模板中的 Azure 密钥保管库获取最新版本的证书
【发布时间】:2019-01-28 12:47:04
【问题描述】:

创建需要安装 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"
   }
}'

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

为了清楚起见,我使用 VM 的 ARM 模板的 secrets 部分中的 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"
        }
      ]
    }
]

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

【问题讨论】:

  • 如果这不可能,您可以在 ARM 部署后编写一个执行此操作的脚本。
  • 在您的管道中,添加一个获取最新版本的脚本,然后将其作为参数传递给 arm 模板。

标签: azure azure-resource-manager azure-keyvault arm-template azure-template


【解决方案1】:

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

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

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

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

【讨论】:

  • 可以简化为:resourceId('Microsoft.KeyVault/vaults/secrets', 'kvname', 'secret name')。不错的收获
  • 不,那不是真的,资源是否存在并不重要。 resourceId() 将始终有效
【解决方案2】:

没有直接\简单的方法可以做到这一点。 Key Vault 并不完全适合 arm 模板。

正如 juunas 建议的那样,您可以编写一个脚本或使用自定义脚本扩展,以使用托管服务身份直接从密钥库中提取该数据。

【讨论】:

    【解决方案3】:

    根据@4c74356b41 的说法,我是自己在python 脚本中完成的。

          data = json.loads(kv_auth_response.content)
          #
          ## Lets find youngest vesrion of certificate
          #
          if len(data['value']) > 0:
             for x in range(len(data['value'])):
                 if x == 0:
                    youngest = data['value'][x]['attributes']['exp']
                    cert_url = data['value'][x]
                 if data['value'][x]['attributes']['exp'] > youngest:
                    youngest = data['value'][x]['attributes']['exp']
                    cert_url = data['value'][x]
             arry = cert_url['id'].split('/')
    ...
             cert_version = arry[len(arry)-1]
    

    在循环的第一步,将过期日期的值赋给“youngest”变量。在接下来的步骤中,脚本将过期日期与其进行比较,并在满足条件时进行分配。 循环脚本与 "yougests" cert_url 拆分后,将数组的最后一部分分配给 "cert_version" 变量。

    您可以在我的自定义域的 BYOC 脚本中看到此问题的完整视图。 链接:https://github.com/przemika/azure-byoc-for-custom-domain/blob/master/start-byoc.py

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 2020-10-19
      • 2020-10-28
      • 2022-01-18
      • 2021-05-12
      • 2020-04-04
      • 2019-03-27
      相关资源
      最近更新 更多