docker 上的 .NET Core 6 使用 https 会引发证书相关错误

问题描述 投票:0回答:1

我最终尝试在 Linux Docker 上运行基于 .NET 6 构建的 REST API。我的 VS 运行在 Windows 10 上,首先在 Windows Docker 桌面上进行测试。想法是在这里运行它并从 Linux docker 导入它。

这是我的 docker 文件。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
#EXPOSE 80
#EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ./TTKDS.Web/TTKDS.Web.csproj ./TTKDS.Web/
COPY ./TTKDS.Infra/TTKDS.Infra.csproj ./TTKDS.Infra/
COPY ./TTKDS.Core/TTKDS.Core.csproj ./TTKDS.Core/
COPY . .
RUN dotnet restore ./TTKDS.Web/TTKDS.Web.csproj --disable-parallel
RUN dotnet build ./TTKDS.Web/TTKDS.Web.csproj  -c Release -o /app/build

FROM build AS publish
RUN dotnet publish ./TTKDS.Web/TTKDS.Web.csproj  -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

EXPOSE 7245
EXPOSE 7345
ENV ASPNETCORE_URLS=http://*:7245;https://*:7345

ENTRYPOINT ["dotnet", "TTKDS.Web.dll"]

现在,如果我只使用 http 运行它,如下所示。一切都很完美。

docker run --rm -p 7245:7245 -e ASPNETCORE_URLS=http://*:7245 ttkds.web:v1

我在 http://localhost:7245/api/Item/1 和使用 up 地址上都得到了简洁的响应。这告诉我我的 docker 文件和底层代码运行正常。

然后我就大胆地使用了https。遵循了这个教程。这是我按顺序执行的命令。

PS D:\Projects\TTKDS Core> dotnet dev-certs https --clean
Cleaning HTTPS development certificates from the machine. A prompt might get displayed to confirm the removal of some of the certificates.
HTTPS development certificates successfully removed from the machine.

PS D:\Projects\TTKDS Core> dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p demoapp
The HTTPS developer certificate was generated successfully.

PS D:\Projects\TTKDS Core> dotnet dev-certs https --trust
Trusting the HTTPS development certificate was requested. A confirmation prompt will be displayed if the certificate was not previously trusted. Click yes on the prompt to trust the certificate.
Successfully trusted the existing HTTPS certificate.

PS D:\Projects\TTKDS Core> dotnet user-secrets init -p .\TTKDS.Web\TTKDS.Web.csproj
The MSBuild project 'D:\Projects\TTKDS Core\.\TTKDS.Web\TTKDS.Web.csproj' has already been initialized with a UserSecretsId.

PS D:\Projects\TTKDS Core> dotnet user-secrets -p .\TTKDS.Web\TTKDS.Web.csproj set "Kestrel:Certificates:Development:Password" "demoapp"
Successfully saved Kestrel:Certificates:Development:Password = demoapp to the secret store.

现在我运行了 2 个不同的命令并收到了 2 个不同的错误!!

命令1

PS D:\Projects\TTKDS Core> docker run --rm -it -p 7245:7245 -p 7345:7345 
    -e ASPNETCORE_URLS="https://*:7345;http://*:7245" 
    -e ASPNETCORE_ENVIRONMENT=Development 
    -v $env:APPDATA\microsoft\UserSecrets\:/root/.microsoft/usersecrets 
    -v $env:USERPROFILE\.aspnet\https:/root/.aspnet/https/ ttkds.web:v1

未处理的异常。 System.InvalidOperationException:无法配置 HTTPS 端点。未指定服务器证书,默认开发者证书找不到或已过期。
要生成开发人员证书,请运行“dotnet dev-certs https”。要信任证书(仅限 Windows 和 macOS),请运行“dotnet dev-certs https --trust”。

命令2:

 PS D:\Projects\TTKDS Core> docker run --rm -p 7245:7245 -p 7345:7345 
     -e ASPNETCORE_URLS=https://localhost:7345 
     -e ASPNETCORE_Kestrel__Certificates__Default__Password=demoapp 
     -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx 
     -v C:\Users\BVSim\.aspnet\https:/https/  ttkds.web:v1

未处理的异常。
System.Security.Cryptography.CryptographicException:无法使用提供的密码读取证书数据,密码可能不正确。
System.Security.Cryptography.CryptographicException:无法使用提供的密码读取证书数据,密码可能不正确。

显然我错过了一些东西。我还不太熟悉 docker compose。你能告诉我我在这里做错了什么吗?

docker .net-6.0 docker-desktop
1个回答
0
投票

找到了!经过 18 小时不间断的谷歌搜索和观看无数的 YouTube 视频。最好的解决方案是从头开始。 Youtube 算法展示了这个视频,我一步步跟随。

这个问题的答案分两步:

  1. 在 31:50 标记处,他解释说你的 pfx 文件应该以与你的库相同的名称命名!
  2. 然后提到从 certmgr 中的 2 个位置清除本地主机证书。 个人 > 证书中的一项 第二个来自受信任的根证书颁发机构 > 证书 就我而言,TRCA 中有 3 个本地主机证书!我猜一个是 Visual Studio 的 IIS Express 做的,另外两个是我做的。

我做的另一件事是让密码变得稍微复杂一些。我在某处偶然读到 Windows 不喜欢简单的密码!不确定这是否正确。

最后启动docker容器的命令是错误的。这是正确的命令。

 PS D:\Projects\TTKDS Core> docker run --rm -p 7245:80 -p 7345:443 
 -e ASPNETCORE_URLS="https://+;http://+" 
 -e ASPNETCORE_Kestrel__Certificates__Default__Password=d3m04pp 
 -e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx 
 -v $env:APPDATA\microsoft\UserSecrets\:/root/.microsoft/usersecrets 
 -v $env:USERPROFILE\.aspnet\https:/root/.aspnet/https/ ttkds.web:v1

现在我的 docker 镜像运行没有错误,并在端口 7345 上响应

© www.soinside.com 2019 - 2024. All rights reserved.