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

PowerShell使用托管标识读取Azure Key Vault密钥连接失败如何解决

问题根因

169.254.169.254是Azure专属的实例元数据服务(IMDS)地址,仅允许运行在Azure云环境内的计算资源(Azure虚拟机、函数、容器实例等)访问,如果你的VDI部署在本地机房、其他云厂商环境,或者Azure内但网络策略限制了对IMDS的访问,就会触发连接失败错误。


解决方案1:VDI部署在Azure环境下的修复方案

  • 先验证IMDS连通性:运行命令Test-NetConnection 169.254.169.254 -Port 80,确认端口连通性
  • 检查VDI所在子网的NSG规则、本地防火墙规则,是否禁止了访问169.254.169.254的80端口请求
  • 检查VDI是否启用了托管标识,配置的用户托管标识client ID是否正确替换了脚本中的<%ManagedIdentitiesClientId%>占位符
  • 如果目标是访问Key Vault,注意脚本中获取token的resource参数要改为https://vault.azure.net,原脚本中https://management.azure.com对应的token仅能访问Azure管理接口,无法访问Key Vault资源

解决方案2:VDI不在Azure环境下的替代实现方案

方案2.1 使用服务主体身份访问Key Vault

  1. 先在Azure AD中注册一个应用,生成客户端密钥,为这个应用分配Key Vault的密钥读取权限
  2. 使用如下脚本获取token并读取Key Vault密钥:
$tenantId = "你的Azure AD租户ID"
$clientId = "注册应用的客户端ID"
$clientSecret = "注册应用的客户端密钥"
$kvName = "你的Key Vault名称"
$secretName = "要读取的密钥名称"

# 获取访问Key Vault的token
$tokenAuthUri = "https://login.microsoftonline.com/$tenantId/oauth2/token"
$body = @{
    grant_type = "client_credentials"
    client_id = $clientId
    client_secret = $clientSecret
    resource = "https://vault.azure.net"
}
$tokenResponse = Invoke-RestMethod -Method Post -Uri $tokenAuthUri -Body $body
$accessToken = $tokenResponse.access_token

# 读取Key Vault密钥
$secretUri = "https://$kvName.vault.azure.net/secrets/$secretName?api-version=7.4"
$secretResponse = Invoke-RestMethod -Method Get -Uri $secretUri -Headers @{Authorization = "Bearer $accessToken"}
Write-Output "读取到的密钥值为:$($secretResponse.value)"

注意不要把客户端密钥硬编码到脚本中,可通过本地加密存储、环境变量等方式传递敏感信息

方案2.2 使用Azure CLI身份认证访问

如果VDI上安装了Azure CLI,可直接用已登录的身份获取Key Vault密钥,不需要硬编码凭证:

# 先执行az login登录Azure账号,也可以用az login --service-principal登录服务主体
az keyvault secret show --name 密钥名称 --vault-name KeyVault名称 --query value -o tsv

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:02