GitLab CI构建Docker镜像时出现NuGet源加载失败、SSL证书无效错误
问题根因
你遇到的SSL证书无效报错核心原因是两个:
- Ubuntu 20.04(对应镜像tag的focal版本)的
update-ca-certificates工具默认仅扫描/usr/local/share/ca-certificates目录下后缀为.crt的证书文件,你当前将证书存放在/etc/ssl/certs下不会被导入系统信任列表 - .NET Core 3.1 SDK默认优先使用自带的CA证书列表,不会主动读取系统更新后的信任证书,需要通过环境变量强制指定使用系统CA存储
可行解决方案
直接修改Dockerfile如下即可:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-focal AS build # 将证书复制到系统CA扫描目录 COPY ./CIdependencies/zscaler-rootca.cer /usr/local/share/ca-certificates/zscaler-rootca.cer COPY ./CIdependencies/zscaler-nuget.cer /usr/local/share/ca-certificates/zscaler-nuget.cer WORKDIR /usr/local/share/ca-certificates # 转换证书格式,统一为crt后缀 RUN openssl x509 -inform DER -in zscaler-nuget.cer -out zscaler-nuget.crt \ && openssl x509 -inform PEM -in zscaler-rootca.cer -out zscaler-rootca.crt \ # 清理原始cer文件避免干扰 && rm *.cer \ # 强制更新系统CA信任列表 && update-ca-certificates -f # 强制.NET使用系统CA证书存储 ENV DOTNET_SYSTEM_NET_HTTP_USE_CA_CERTIFICATES_ENVIRONMENT_VARIABLE=1 ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt WORKDIR /src COPY ["apps.csproj", ""] RUN dotnet restore "./apps.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "apps.csproj" -c Release -o /app/build RUN dotnet publish "apps.csproj" -c Release -o /app/publish
额外验证方案
如果修改后仍然报错,可以先通过临时添加跳过证书校验的参数定位问题(仅用于测试,禁止生产环境使用):
在dotnet restore命令后添加参数:--disable-parallel --configfile <(echo '<configuration><packageSources><add key="nuget" value="https://api.nuget.org/v3/index.json"/></packageSources><runtime><AppContextSwitchOverrides value="System.Net.Http.UseSocketsHttpHandler=false"/></runtime></configuration>')
内容的提问来源于stack exchange,提问作者lakshman
相关产品推荐
相关产品推荐

