You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为App Service授予从Key Vault链接SSL证书的必要权限?

问题描述

通过Bicep模板创建App Service时,尝试链接同一资源组内启用了Azure RBAC的Key Vault中的SSL证书,使用以下代码部署失败:

resource certEncryption 'Microsoft.Web/certificates@2018-02-01' = {
  name: '${resourcePrefix}-cert-encryption'
  location: location
  properties: {
    keyVaultId: resourceId('myResourceGroup', 'Microsoft.KeyVault/vaults', keyVaultName)
    keyVaultSecretName: '${resourcePrefix}-cert-encryption'
    serverFarmId: hostingPlan.id
    password: 'SecretPassword'
  }
  dependsOn: [
    webApi
  ]
}

报错信息:

The service does not have access to '/subscriptions/3449f-xxxx/resourcegroups/rgabptrialt/providers/microsoft.keyvault/vaults/my-test-vault' Key Vault. Please make sure that you have granted necessary permissions to the service to perform the request operation.

需明确:要授予哪些具体权限、授予对象是谁、配置方式,以及是否需要为App Service创建托管标识。

解决方案

1. 必须创建App Service系统托管标识

由于Key Vault启用了Azure RBAC,必须通过托管标识授予权限,无法使用传统访问策略。在Bicep中为App Service添加系统托管标识:

resource webApi 'Microsoft.Web/sites@2022-09-01' = {
  name: '${resourcePrefix}-webapi'
  location: location
  identity: {
    type: 'SystemAssigned'
  }
  // 其余App Service配置项...
}

2. 分配Key Vault权限

需为App Service的系统托管标识分配Key Vault Secrets User内置角色(该角色包含读取密钥/证书的必要权限),也可根据最小权限原则创建自定义角色。

在Bicep中添加角色分配:

resource keyVaultSecretUserRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(keyVault.id, webApi.id, 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7')
  scope: keyVault
  properties: {
    principalId: webApi.identity.principalId
    roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', 'b86a8fe4-44ce-4948-aee5-eccb2c155cd7') // Key Vault Secrets User角色ID
    principalType: 'ServicePrincipal'
  }
  dependsOn: [
    webApi
    keyVault
  ]
}

3. 调整证书资源配置

移除password字段(Key Vault中存储的PFX证书密码已包含在密钥内,无需单独指定),并确保依赖顺序正确:

resource certEncryption 'Microsoft.Web/certificates@2022-09-01' = {
  name: '${resourcePrefix}-cert-encryption'
  location: location
  properties: {
    keyVaultId: keyVault.id
    keyVaultSecretName: '${resourcePrefix}-cert-encryption'
    serverFarmId: hostingPlan.id
  }
  dependsOn: [
    webApi
    keyVaultSecretUserRoleAssignment // 确保权限分配完成后再创建证书
  ]
}

关键要点

  • 授予对象:App Service的系统托管标识(而非App Service实例或部署用户)。
  • 必要权限:读取Key Vault中的证书/密钥,Key Vault Secrets User内置角色足以满足需求;如需最小权限,可创建仅包含Microsoft.KeyVault/vaults/secrets/get和Microsoft.KeyVault/vaults/secrets/list权限的自定义角色。
  • API版本建议:使用较新的API版本(如2022-09-01),避免旧版本兼容性问题。

内容的提问来源于stack exchange,提问作者Vivendi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:35:15