无法在 Docker 容器中为 ASP.NET Core Web App 创建开发证书

Pur*_*ome 6 https docker .net-core asp.net-core

我正在尝试创建一个简单的 ASP.NET-Core 2.1 Web 应用程序,它在 Docker 中运行并强制使用 HTTPS。

如果我不强制使用 HTTPS,则 Web 应用程序在 Docker 实例中运行良好。如果我强制使用 HTTPS,或手动尝试访问 HTTPS 端口,我会收到“无法连接”错误或类似的错误信息。

因此,根据我的理解,我需要以某种方式将受信任的自签名开发证书从我的本地主机开发机器复制到 Docker 实例。

幸运的是,有一些很好的文档可以帮助解释/谈论这个:

但是每次我尝试开始第一个主要步骤 -> 创建证书时,我都会收到以下错误:

C:\Users\justi>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.

C:\Users\justi>dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\hornet.apigateway.website.public.pfx -p secretpassword
A valid HTTPS certificate is already present.
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,我只是尝试清理我的证书存储(我确实被要求确认删除证书),然后尝试创建一个新的。

上面的命令基于上面链接中的示例。

我觉得错误信息不正确并且没有显示真正的错误信息?


更新

以防万一我弄乱了我的 Docker 文件内容,这是我的 2x docker-compose 文件:

docker-compose.yml

apigateway.website.public:
    image: hornet/apigateway.website.public
    build:
      context: .
      dockerfile: src/Api Gateways/ApiGateway.Website.Public/Dockerfile
    #ports:
    #  - "5000:443"
    depends_on:
      - microservice1.api
      - microservice2.api

docker-compose.override.yml

apigateway.website.public:
  environment:
    - ASPNETCORE_ENVIRONMENT=Development
    - ASPNETCORE_URLS=https://localhost;http://localhost
    - ASPNETCORE_HTTPS_PORT=5001
  ports:
  # NOTE: need to copy the dev cert over to the container
  # REF:  o) https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetcore-docker-https-development.md
  #       o) https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetcore-docker-https.md
  #       o) https://github.com/aspnet/Docs/issues/3310
  #       o) https://github.com/aspnet/Docs/issues/6199
    - "5000:80"
    - "5001:443"
  volumes:
    - ${APPDATA}/Microsoft/UserSecrets/:/root/.microsoft/usersecrets
    - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https/
Run Code Online (Sandbox Code Playgroud)

小智 4

我最近让它为我的项目工作。我从生成的 Visual Studio Docker Compose 文件中抄袭了很多内容。

我在您的撰写语法中发现了一些差异,这些差异可能会导致您的问题。

首先,你的环境变量 - 我不确定你正在使用什么版本的 compose。我使用的是 3.7,我可以这样定义变量:

      ASPNETCORE_ENVIRONMENT: "Development"
      ASPNETCORE_URLS: "https://+:443;http://+:80"
      ASPNETCORE_HTTPS_PORT: "44371"
Run Code Online (Sandbox Code Playgroud)

请注意,这里的主要区别在于,我使用域通配符声明我的 aspnetcore url,并在其后直接声明端口号https://+:443;http://+:80作为内部端口号

我能够通过https://localhost:44371完全按照我的预期访问该应用程序。

我仍然在我的 compose 文件中定义端口,但我认为这里最主要的是您需要通过 ASPNETCORE_URLS 环境变量告诉 aspnet core 端口是什么。您的 compose 文件中声明的端口正在通知您的 docker 容器,而不是您的应用程序。

因此,可能适合您的撰写文件如下:

apigateway.website.public:
  environment:
    ASPNETCORE_ENVIRONMENT: "Development"
    ASPNETCORE_URLS: "https://+:443;http://+:80"
    ASPNETCORE_HTTPS_PORT: "5001"
  volumes:
    - ${APPDATA}/Microsoft/UserSecrets/:/root/.microsoft/usersecrets:ro
    - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
  ports:
    - "5000:80"
    - "5001:443"
Run Code Online (Sandbox Code Playgroud)

我还在您的卷上添加了 :ro(只读)指示器,因为这似乎是最佳实践。