从ARM模板中的Azure密钥库中获取最新版本的证书

时间:2019-01-28 12:47:04

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

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

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,该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"
        }
      ]
    }
]
  

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

3 个答案:

答案 0 :(得分:4)

有可能与接受的答案相反。 像这样用secret的资源ID定义变量,例如:

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

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

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

答案 1 :(得分:1)

没有直接,简单的方法可以做到这一点。 Key Vault并不完全友好于手臂模板。

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

答案 2 :(得分:0)

根据@ 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]

在循环的第一步,将到期日期的值分配给“最年轻”变量。在接下来的步骤中,脚本将与过期日期进行比较,并指定何时满足条件。 After循环脚本使用“ yougests” cert_url拆分,并将数组的最后一部分分配给“ cert_version”变量。

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