创建一个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"
}
]
}
]
注意::您可以指定要安装的最新版本的操作系统,但不能指定安装证书的最新版本,这很奇怪。
答案 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