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
- Windows环境:
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ł
相关产品推荐
相关产品推荐

