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

.NET Isolated模式Azure函数应用无法获取Azure Key Vault密钥

.NET Isolated模式Azure函数应用无法获取Azure Key Vault密钥

我来帮你排查这个问题哈!你遇到的SSL连接失败问题有点奇怪——明明命令行能正常拿到Key Vault的密钥,但Isolated模式的函数里就报错,咱们一步步来拆解解决:

先理清楚你的现状

  • 命令行执行az keyvault secret show --vault-name myvault --name test --query value -o tsv完全正常,说明你的账号权限没问题,Key Vault本身也能正常访问
  • 你用的是**.NET 8 Isolated模式**的Azure函数(v4版本),相关NuGet包:
    <PackageReference Include="Azure.Identity" Version="1.14.1" />
    <PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.8.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="2.0.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.3.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="2.0.5" />
    
  • 函数代码里已经尝试设置TLS12,但还是抛出了包含SSL连接失败的AggregateException:

    [2025-07-05T11:52:36.479Z] Azure.RequestFailedException: The SSL connection could not be established, see inner exception.

排查解决步骤

1. 给Key Vault客户端单独指定TLS版本

你在Program.cs里设置的全局TLS12,可能没生效到Key Vault的客户端请求上(Isolated模式是独立进程,全局设置有时候会有覆盖)。试试直接给SecretClient配置TLS12:

[Function("PleaseWork")]
public async Task RunAsync([TimerTrigger("0,15,30,45 * * * * *")] TimerInfo myTimer)
{
    var vaultName = "https://myvault.vault.azure.net/";
    
    // 给客户端单独配置TLS12
    var clientOptions = new SecretClientOptions
    {
        Transport = new HttpClientTransport(new HttpClient(new HttpClientHandler
        {
            SslProtocols = System.Security.Authentication.SslProtocols.Tls12
        }))
    };
    
    var client = new SecretClient(new Uri(vaultName), new DefaultAzureCredential(), clientOptions);
    _logger.LogInformation("Getting secret...");
    var secret = await client.GetSecretAsync("test");
    _logger.LogInformation($"Secret: {secret.Value}");
}

2. 检查本地开发环境的SSL证书

本地开发时,Azure Functions Core Tools的SSL证书可能没正确信任,导致无法验证Key Vault的HTTPS证书:

  • 打开命令行,执行func trust,按照提示完成证书的信任操作
  • 检查本地机器的受信任根证书颁发机构,确认包含Azure相关的根证书(比如Baltimore CyberTrust Root)

3. 验证身份验证方式是否正确

虽然命令行能用,但函数里的DefaultAzureCredential可能没有正确选用身份(它会按优先级尝试多种凭据)。可以先强制用Azure CLI的凭据测试,排除身份验证的间接影响:

var credential = new AzureCliCredential();
var client = new SecretClient(new Uri(vaultName), credential);

如果这样能成功,说明DefaultAzureCredential在本地没找到合适的凭据,可以检查是否设置了AZURE_CLIENT_ID、AZURE_TENANT_ID、AZURE_CLIENT_SECRET这些环境变量,或者确认Azure CLI登录的是正确的账号。

4. 排查网络代理/防火墙问题

如果你的开发机器在公司网络下,可能代理或防火墙阻止了函数进程访问Key Vault的443端口:

  • 暂时关闭代理试试能不能正常访问
  • 如果必须用代理,给HttpClient配置代理信息:
    var handler = new HttpClientHandler
    {
        SslProtocols = System.Security.Authentication.SslProtocols.Tls12,
        Proxy = new WebProxy("http://your-proxy-address:port"),
        UseProxy = true
    };
    var clientOptions = new SecretClientOptions
    {
        Transport = new HttpClientTransport(new HttpClient(handler))
    };
    var client = new SecretClient(new Uri(vaultName), new DefaultAzureCredential(), clientOptions);
    

5. 更新NuGet包到最新稳定版

你用的Azure SDK版本不算太旧,但有时候旧版本的SDK在TLS处理上会有已知bug。试试更新到最新稳定版:

  • Azure.Identity 更新到1.15.0+
  • Azure.Security.KeyVault.Secrets 更新到4.9.0+

按照这些步骤排查下来,应该能解决你的SSL连接问题啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:10:18