我尝试通过REST API(在PowerShell中)向Azure应用服务添加私有自签名证书(如底部的屏幕截图)。我按如下方式调用API:
$certBody = @{
name = "InfoServiceTAKeyVaultDev"
location = "West Europe"
properties = @{
keyVaultId = "/subscriptions/<subscriptionId>/resourceGroups/BzInfoServiceTADEV/providers/Microsoft.KeyVault/vaults/BzKVInfoServiceTADev"
keyVaultSecretName = "InfoServiceTAKeyVaultCert"
}
}
Invoke-RestMethod `
-Method Put `
-Uri ("https://management.azure.com/subscriptions/<subscriptionId>" +
"/resourceGroups/BzInformatieServiceResourceGroupDEV" +
"/providers/Microsoft.Web/certificates" +
"/InfoServiceTAKeyVaultDev" +
"?api-version=2016-03-01") `
-Headers @{ Authorization = ("Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSU...")
"Content-Type" = "application/json" } `
-Body ($certBody | ConvertTo-Json -Compress -Depth 3)
结果是一条错误消息:The service does not have access to
'/subscriptions/<subscriptionId>/resourcegroups/bzinfoservicetadev/providers/microsoft.keyvault/vaults/bzkvinfoservicetadev' Key Vault. Please make sure that you
have granted necessary permissions to the service to perform the request operation.
在此背景下,谁是&#39; 服务&#39;无权访问此Key Vault?我已经发现some posts声称我应该将服务主体abfa0a7c-a6b6-4736-8310-5855508787cd
添加到我的密钥保管库访问策略中,但这没有任何效果。
所需最终结果的屏幕截图:
更新:我已启用高级访问策略启用Azure Resource Manager访问以进行模板部署。这也不行。
答案 0 :(得分:0)
您需要添加Enable access to Azure Resource Manager for template deployment
高级访问策略。
您没有直接将证书添加到webapp,而是告诉webapp存在证书的位置。 Web应用程序依靠资源管理器实际去收集证书并将其安装到webapp中。
密钥保险库确实具有广泛的审计日志记录,可以启用这些日志记录来了解试图访问机密的内容,使这些问题更容易调试。
答案 1 :(得分:0)
@ tim-scriv的评论非常有帮助。我必须在Key Vault访问策略中添加以下主体:Microsoft Azure App Service
(对象ID:3ed082e0-d6c4-4071-ac9e-61363535a0a3
)。获得秘密的权限就足够了。
答案 2 :(得分:0)
我遇到了上述问题,并通过关注本文https://github.com/Azure/azure-quickstart-templates/tree/master/201-web-app-certificate-from-key-vault;
默认情况下,“ Microsoft.Azure.WebSites”资源提供者(RP)无权访问模板中指定的Key Vault,因此您需要在部署模板之前通过执行以下PowerShell命令对其进行授权:>
Login-AzureRmAccount
Set-AzureRmContext -SubscriptionId AZURE_SUBSCRIPTION_ID
Set-AzureRmKeyVaultAccessPolicy -VaultName KEY_VAULT_NAME -ServicePrincipalName abfa0a7c-a6b6-4736-8310-5855508787cd -PermissionsToSecrets get
ServicePrincipalName参数代表用户租户中的Microsoft.Azure.WebSites RP,并且对于所有Azure订阅都将保持不变。这是一次性操作。正确配置密钥保管库后,就可以使用它来部署所需的任意数量的证书,而无需再次执行这些PowerShell命令。
答案 3 :(得分:0)
添加Microsoft Azure App Service
主体以GET
对KeyVault的访问权也为我解决了同一问题。
就我而言,我试图使用azurerm_template_deployment
命令通过Terraform执行ARM模板,以将SSL证书添加到Azure Web App服务,然后将证书绑定到URL。