如何自动为现有Azure应用服务配置Key Vault证书
Azure Key Vault 关联现有App/Function Apps自动化实现方案
前置条件确认
- 所有目标App Service/Function App已启用系统分配托管标识(system assigned identity = true)
- 操作账号具备Key Vault管理员、App Service贡献者及相关资源组的访问权限
- 目标证书已提前存入Azure Key Vault中
方案1:PowerShell 脚本实现
首先确保本地已安装Az模块,执行前先运行Connect-AzAccount登录Azure租户,替换脚本中占位符为实际资源参数即可运行:
# 配置参数 $subscriptionId = "你的订阅ID" $keyVaultName = "目标Key Vault名称" $appName = "App Service/Function App名称" $resourceGroupName = "资源组名称" $certNameInKV = "Key Vault中的证书名称" $certStoreName = "My" # 证书存储位置默认用My即可 # 切换订阅 Set-AzContext -Subscription $subscriptionId # 1. 获取App的系统托管标识ID $app = Get-AzWebApp -ResourceGroupName $resourceGroupName -Name $appName $identityId = $app.Identity.PrincipalId # 2. 为托管标识添加Key Vault访问策略,授予证书读取权限 Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName ` -ObjectId $identityId ` -PermissionsToCertificates Get,List ` -PassThru # 3. 从Key Vault导入证书到App Service $kv = Get-AzKeyVault -VaultName $keyVaultName -ResourceGroupName $resourceGroupName $certSecretId = (Get-AzKeyVaultCertificate -VaultName $keyVaultName -Name $certNameInKV).SecretId New-AzWebAppCertificate -ResourceGroupName $resourceGroupName ` -Name $certNameInKV ` -WebAppName $appName ` -KeyVaultId $kv.ResourceId ` -KeyVaultSecretId $certSecretId ` -Location $app.Location
脚本执行完成后可在App Service的TLS/SSL设置中查看已导入的证书。
方案2:Azure Automation 实现
- 提前创建Azure Automation账户,在【模块】中导入Az.Accounts、Az.KeyVault、Az.Websites三个模块
- 在自动化账户的【身份标识】中启用系统托管标识,为该标识授予对应资源组的贡献者权限、Key Vault的管理员权限
- 创建PowerShell类型的Runbook,粘贴以下代码,配置参数后即可手动触发或配置定时触发:
Param( [Parameter(Mandatory=$true)] [string]$SubscriptionId, [Parameter(Mandatory=$true)] [string]$ResourceGroupName, [Parameter(Mandatory=$true)] [string]$KeyVaultName, [Parameter(Mandatory=$true)] [string]$AppName, [Parameter(Mandatory=$true)] [string]$CertNameInKV ) # 自动化账户登录 Connect-AzAccount -Identity Set-AzContext -Subscription $SubscriptionId # 后续逻辑和上述PowerShell脚本一致 $app = Get-AzWebApp -ResourceGroupName $ResourceGroupName -Name $AppName $identityId = $app.Identity.PrincipalId Set-AzKeyVaultAccessPolicy -VaultName $KeyVaultName ` -ObjectId $identityId ` -PermissionsToCertificates Get,List ` -PassThru $kv = Get-AzKeyVault -VaultName $KeyVaultName -ResourceGroupName $ResourceGroupName $certSecretId = (Get-AzKeyVaultCertificate -VaultName $KeyVaultName -Name $CertNameInKV).SecretId New-AzWebAppCertificate -ResourceGroupName $ResourceGroupName ` -Name $CertNameInKV ` -WebAppName $AppName ` -KeyVaultId $kv.ResourceId ` -KeyVaultSecretId $certSecretId ` -Location $app.Location
方案3:Terraform 实现
如果现有资源已经通过Terraform管理,可直接添加以下配置片段,执行terraform apply即可完成配置:
# 引用现有App Service资源 data "azurerm_linux_web_app" "existing_app" { name = "你的App名称" resource_group_name = "资源组名称" } # 引用现有Key Vault资源 data "azurerm_key_vault" "existing_kv" { name = "Key Vault名称" resource_group_name = "资源组名称" } # 引用Key Vault中的现有证书 data "azurerm_key_vault_certificate" "existing_cert" { name = "证书在Key Vault中的名称" key_vault_id = data.azurerm_key_vault.existing_kv.id } # 添加Key Vault访问策略,授予App托管标识证书读取权限 resource "azurerm_key_vault_access_policy" "app_cert_access" { key_vault_id = data.azurerm_key_vault.existing_kv.id tenant_id = data.azurerm_linux_web_app.existing_app.identity[0].tenant_id object_id = data.azurerm_linux_web_app.existing_app.identity[0].principal_id certificate_permissions = [ "Get", "List" ] } # 导入证书到App Service resource "azurerm_app_service_certificate" "imported_cert" { name = "导入后的证书名称" resource_group_name = data.azurerm_linux_web_app.existing_app.resource_group_name location = data.azurerm_linux_web_app.existing_app.location key_vault_secret_id = data.azurerm_key_vault_certificate.existing_cert.secret_id depends_on = [azurerm_key_vault_access_policy.app_cert_access] }
如果是Function App或者Windows Web App,把azurerm_linux_web_app替换为对应数据源即可。
内容的提问来源于stack exchange,提问作者Hari Krishna
相关产品推荐
相关产品推荐

