我们得到了这个巨大的天蓝色的蓝图模板,它为我们创建了很多工件。工件之一是Azure Key Vault。密钥保险箱已创建,所需的机密就在其中。
他尝试创建的其他工件之一是Microsoft.Web /证书。我们尝试使用下面的json
创建它 {
"name": "create-certificate",
"kind": "template",
"properties": {
"template": {
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"name": {
"type": "string"
},
"location": {
"type": "string"
},
"vaultName": {
"type": "string"
},
"serverFarmId": {
"type": "string"
}
},
"resources": [
{
"type": "Microsoft.Web/certificates",
"name": "[parameters('name')]",
"apiVersion": "2016-03-01",
"location": "[parameters('location')]",
"properties": {
"keyVaultId": "[resourceId('Microsoft.KeyVault/vaults', parameters('vaultName'))]",
"keyVaultSecretName": "Origin-Certificate",
"serverFarmId": "[parameters('serverFarmId')]"
}
}
]
},
"resourceGroup": "TD-RG",
"parameters": {
"name": {
"value": "[concat(parameters('environmentSuffix'), '-Orgin')]"
},
"location": {
"value": "[parameters('location')]"
},
"vaultName": {
"value":"[concat(parameters('environmentSuffix'), '-Vault')]"
},
"ServerFarmId": {
"value": "[artifacts('create-service-plan').outputs.ServerFarmId]"
}
},
"dependsOn": ["create-service-plan", "create-key-vault"]
}
}
因此很高兴我们首先创建一个服务计划和密钥库,然后尝试从密钥库机密中读取原始证书。然后我们得到的错误是:
该服务无权访问“ {KEY VAULT PATH}” Key Vault。 请确保您已授予对 服务执行请求操作。
在Internet上搜索,我们发现我们可以为密钥库提供更多权限。带有以下powershell命令:
Set-AzureRmKeyVaultAccessPolicy -VaultName KEYVAULTNAME -PermissionsToSecrets get `
-ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd
此脚本的来源:Issue with KeyVault reference in ARM template
但是,这样做的问题是,权限被创建密钥库的工件定义所覆盖,因此无法通过Power Shell进行设置。但是我无法在蓝图中做到这一点。对于其他用户,当我们创建密钥库时,我已经设置了权限,并且可以使用。但是像下面这样添加它是行不通的。
{
"objectId": "abfa0a7c-a6b6-4736-8310-5855508787cd",
"tenantId": "[parameters('tenantId')]",
"permissions": {
"secrets": [
"get"
]
}
}
因此,现在如何创建密钥库并在下一个工件中使用秘密仍然是一个谜。
答案 0 :(得分:0)
我注意到您在Powershell abfa0a7c-a6b6-4736-8310-5855508787cd
和ARM模板中都使用了相同的GUID Set-AzureRmKeyVaultAccessPolicy
,这就是原因。
在Set-AzureRmKeyVaultAccessPolicy
中,我们需要为Application ID(i.e. Client ID)
传递-ServicePrincipalName
,描述为here。但是在ARM模板中,我们需要传递服务主体的Object ID
(不是应用程序注册),它不同于Application ID
。
要获取服务主体的Object ID
,可以使用Powershell Get-AzureRmADServicePrincipal
,在我的屏幕快照中,我使用新的Az
命令,在您的情况下,只需使用{{ 1}},Get-AzureRmADServicePrincipal
就是您需要的Id
。
注意:确保登录Powershell的帐户具有在AAD租户中获取服务主体的权限。
Object ID
然后在您的ARM模板中,使用Get-AzureRmADServicePrincipal -ApplicationId abfa0a7c-a6b6-4736-8310-5855508787cd
代替Object ID
,它将正常工作。
Application ID