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

Docker中Azurite模拟器本地Blob访问SSL连接异常排查

问题描述

我正在构建一款读取JSON文件的Web应用,计划将这些JSON平面文件托管在Azure Blob存储中,再通过API暴露给Web应用。目前我正搭建本地开发环境,短期目标是在Docker容器中部署Azurite模拟器,并构建一个简单的控制台应用连接该模拟器读取JSON文件。

我已通过Docker Compose文件启动Azurite容器,配置如下:

version: '3.9'
services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    container_name: 'azurite-console'
    hostname: azurite
    restart: always
    command: 'azurite --oauth basic --cert /workspace/127.0.0.1.pem --key /workspace/127.0.0.1-key.pem'
    ports:
      - 10000:10000
      - 10001:10001
      - 10002:10002  
    volumes:
      - ./certs:/workspace

容器已正常运行并启用HTTPS,证书通过mkcert工具生成。但运行以下.NET控制台应用代码时:

static void Main(string[] args)
{
    // With container URL and DefaultAzureCredential
    var client = new BlobServiceClient(
        new Uri("https://127.0.0.1:10000"),
        new DefaultAzureCredential()
    );
    Console.WriteLine("list containers");
    try
    {
        var containers = client.GetBlobContainers();
        foreach (var c in containers)
            Console.WriteLine(c.Name);
    }
    catch(Exception ex){
        Console.WriteLine(ex.Message);
    }
}

出现如下异常:

Retry failed after 6 tries. Retry settings can be adjusted in ClientOptions.Retry. (The SSL connection could not be established, see inner exception.)

我猜测.NET应用需要配置证书才能访问Docker中的Azurite,但对此不太熟悉,请问问题出在哪里?

问题分析与解决

核心问题是.NET运行时不认可mkcert生成的自签名证书,导致SSL握手失败,同时认证方式配置也存在问题,以下是具体解决步骤:

1. 信任mkcert根证书

mkcert生成的证书依赖本地根证书,需要将其添加到.NET信任体系:

  • 先获取根证书目录:
    mkcert -CAROOT
    
    输出路径类似~/Library/Application Support/mkcert(macOS)或C:\Users\<用户名>\AppData\Local\mkcert(Windows)。
  • 导入根证书:
    • Windows环境:
      dotnet dev-certs https --trust --cert-file "<根证书路径>/rootCA.pem"
      
    • macOS/Linux环境:
      sudo cp "<根证书路径>/rootCA.pem" /usr/local/share/ca-certificates/rootCA.crt
      sudo update-ca-certificates
      

2. 修正认证方式

启用basic OAuth的Azurite需要使用存储账户密钥认证,DefaultAzureCredential会自动尝试多种认证流程,不适合本地模拟器场景,修改代码如下:

static void Main(string[] args)
{
    // Azurite默认账户名和密钥
    var accountName = "devstoreaccount1";
    var accountKey = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==";
    var credential = new StorageSharedKeyCredential(accountName, accountKey);
    
    // Blob服务URL需要包含账户名
    var client = new BlobServiceClient(
        new Uri("https://127.0.0.1:10000/devstoreaccount1"),
        credential
    );
    
    Console.WriteLine("list containers");
    try
    {
        var containers = client.GetBlobContainers();
        foreach (var c in containers)
            Console.WriteLine(c.Name);
    }
    catch(Exception ex){
        Console.WriteLine(ex.Message);
        // 打印内部异常,便于排查细节
        if (ex.InnerException != null)
            Console.WriteLine($"Inner Exception: {ex.InnerException.Message}");
    }
}

3. 验证容器证书挂载

确保Docker Compose挂载的证书文件能被Azurite正常读取,执行以下命令检查容器内文件:

docker exec -it azurite-console ls /workspace

确认127.0.0.1.pem和127.0.0.1-key.pem存在且路径正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:25:28