我正在尝试为我的 donet core 7 应用程序构建一个 docker 映像。 我使用公司代理,因此我将以下几行添加到我的 dockerfile 中:
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
COPY ca.crt /usr/local/share/ca-certificates/ca.crt
ENV http_proxy http://proxy-server:8080
ENV https_proxy http://proxy-server:8080
ENV HTTP_PROXY http://proxy-server:8080
ENV HTTPS_PROXY http://proxy-server:8080
RUN dotnet restore "src/Api/PositionApi/PositionApi.csproj"
运行 docker build 命令时,在 nuget 包下载期间,我在
dotnet restore
命令上收到错误:
#23 1.995 信息:X.509 证书链验证将使用后备证书捆绑包 '/usr/share/dotnet/sdk/7.0.402/trustedroots/codesignctl.pem'。 #23 2.020 信息:X.509 证书链验证将使用后备证书捆绑包 '/usr/share/dotnet/sdk/7.0.402/trustedroots/timestampctl.pem'。 #23 2.024 信息:将包“Microsoft.EntityFrameworkCore”的 PackageReference 添加到项目“/src/src.csproj”中。 #23 8.825 错误:无法加载源 http://api.nuget.org/v3/index.json 的服务索引。 #23 8.825 错误:无法建立 SSL 连接,请参阅内部异常。 #23 8.825 错误:由于证书链中的错误,远程证书无效:UntrustedRoot
为什么 dotnet Restore 命令忽略我的证书?以及如何配置 dotnet cli 以使用操作系统证书而不是依赖“/usr/share/dotnet/sdk/7.0.402/trustedroots/timestampctl.pem”?
谢谢
dotnet Restore 命令会忽略您的证书,因为它使用的是
/usr/share/dotnet/sdk/7.0.402/trustedroots/timestampctl.pem
处的后备证书捆绑包,而不是您已复制到 /usr/local/share/ca-certificates/ca.crt
的证书。
要将 dotnet CLI 配置为使用操作系统证书而不是依赖后备证书捆绑包,您可以将
DOTNET_ROOT
环境变量设置为存储操作系统证书的目录。例如,在 Linux 上,您可以将 DOTNET_ROOT
环境变量设置为 /etc/ssl/certs
。
这里是更新的 Dockerfile,展示了如何配置 dotnet CLI 以使用操作系统证书:
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
COPY ca.crt /etc/ssl/certs/ca.crt
ENV DOTNET_ROOT /etc/ssl/certs
ENV http_proxy http://proxy-server:8080
ENV https_proxy http://proxy-server:8080
ENV HTTP_PROXY http://proxy-server:8080
ENV HTTPS_PROXY http://proxy-server:8080
RUN dotnet restore "src/Api/PositionApi/PositionApi.csproj"
更新 Dockerfile 后,您可以使用以下命令再次构建 docker 映像:
docker build -t position-api .
这次,dotnet Restore 命令应该能够成功下载 NuGet 包。
请注意,不建议在生产环境中禁用证书验证,因为这可能会使您的应用程序面临安全漏洞。