如何在 Linux 上运行 Visual Studio 2019 生成的 dockered ASP.net 核心应用程序?SSL 配置问题

Pio*_*rek 9 docker .net-core docker-compose asp.net-core

我在 Visual Studio 2019 中创建了新的 ASP.net Core 2.1 项目。我选择生成 Docker linux 容器和 docker-compose 文件。当我使用 VS 运行它时,一切正常。

当我尝试在类似生产的环境中运行我的应用程序时出现问题。为了做到这一点,我将 git-cloned 代码复制到 targer linux 机器上。然后我docker-compose up在我的项目文件夹中运行。

起初它不起作用,因为应用程序使用 HTTPS 并且机器上没有 localhost 的 HTTPS 证书。我需要生成证书:

dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml我指定了一个卷,将带有证书的文件夹链接到我的应用程序在其中查找证书的 docker 容器内的文件夹(下面代码的最后一行)。

version: '3.4'

services:
  mongo:
      # not relevant

  mongo-express:
      # not relevant

  synceddb:
      image: ${DOCKER_REGISTRY-}synceddb
      ports:
        - 13000:13000
        - "10002:80"
        - "44361:443"
      build:
        context: .
        dockerfile: SyncedDB/Dockerfile
      depends_on:
        - mongo
      environment:
        - ASPNETCORE_ENVIRONMENT=Development
        - ASPNETCORE_URLS=https://+:443;http://+:80
        - ASPNETCORE_HTTPS_PORT=44361
        - ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword"
        - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx
      volumes:
      - ${HOME}/.aspnet/https:/https/
Run Code Online (Sandbox Code Playgroud)

Dockerfile 如下所示:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["SyncedDB/SyncedDB.csproj", "SyncedDB/"]
RUN dotnet restore "SyncedDB/SyncedDB.csproj"
COPY . .
WORKDIR "/src/SyncedDB"
RUN dotnet build "SyncedDB.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "SyncedDB.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "SyncedDB.dll"]

Run Code Online (Sandbox Code Playgroud)

问题是:我的应用程序没有看到我的证书(至少我是这样解释这个错误的)

暴击:Microsoft.AspNetCore.Server.Kestrel[0]

无法启动 Kestrel。

Interop+Crypto+OpenSslCryptographicException:错误:2006D080:BIO 例程:BIO_new_file:没有这样的文件

在 [...]

未处理的异常:Interop+Crypto+OpenSslCryptographicException:错误:2006D080:BIO 例程:BIO_new_file:没有这样的文件

[...]

BRB*_*dot 8

好吧,我想通了!请按照以下具体步骤操作。保证这对你有用..所以这里是..

在 CLI 上,在您的应用程序根目录中按以下相同顺序运行以下命令:

$ mkdir conf.d
$ dotnet dev-certs https --clean
$ dotnet dev-certs https -ep ./conf.d/https/dev_cert.pfx -p madison
$ dotnet dev-certs https --trust
Run Code Online (Sandbox Code Playgroud)

确保 dev_cert.pfx 文件在 ./conf.d/https 文件夹中可用。现在在您的 docker-compose 文件中修改您的 api 服务,如下所示:

...

api:
    container_name: mad.api
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+80
      - ASPNETCORE_HTTPS_PORT=44311
      - ASPNETCORE_Kestrel__Certificates__Default__Password=madison
      - ASPNETCORE_Kestrel__Certificates__Default__Path=/https/dev_cert.pfx
    ports:
      - "50420:80"
      - "44361:443"
    volumes:
      - ./conf.d/https/:/https/
    networks:
      - mad_network

...


$ docker-compose down # Down any previous setup
$ docker-compose up --build -d # Build and run containers
$ docker-compose ps # Check status of api..make sure its "up"
$ docker-compose logs -f api # Check logs
Run Code Online (Sandbox Code Playgroud)

现在,尝试这些网址中的任何一个,看看它们是否有效!!(注意:您的代码中可能没有天气预报端点……使用适当的端点,否则您将收到 404

http://localhost:50420/ weatherforecast https://localhost:44361/weatherforecast

(它对我不起作用的原因是因为当我运行dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p { password here }它时, 它在我的根目录中创建了一个奇怪名称的 pfx,而不是在 -ep 参数中指定的位置。我现在使用的是 asp.net core 3.0。这个命令以前在 asp.net core 2.2 上运行良好。所以必须在 2.2 和 3.0 之间发生一些变化!另外有趣的是,asp.net core 3.0 似乎摆脱了 docker-compose 项目,这是一个巨大的祝福!:祈祷:#blessed )


Pio*_*rek 5

终于修好了。我的配置中有两个错误:

1:证书密码中不必要的引号

有:

- ASPNETCORE_Kestrel__Certificates__Default__Password="crypticpassword"
Run Code Online (Sandbox Code Playgroud)

应该:

- ASPNETCORE_Kestrel__Certificates__Default__Password=crypticpassword
Run Code Online (Sandbox Code Playgroud)

2:应用程序在错误的地方寻找证书。

sudo以 root 身份使用 docker with ,但使用普通帐户生成了证书。我以为${HOME}会指向我的主文件夹,但它指向的是根文件夹。