通过REST API将证书从Azure Key Vault添加到Azure App Service

时间:2018-04-06 06:39:29

标签: rest azure azure-web-sites azure-keyvault azure-app-service-plans

我尝试通过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添加到我的密钥保管库访问策略中,但这没有任何效果。

所需最终结果的屏幕截图:

Desired end result

更新:我已启用高级访问策略启用Azure Resource Manager访问以进行模板部署。这也不行。

4 个答案:

答案 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。