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

时间:2018-09-04 13:35:30

标签: docker asp.net-core https .net-core

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

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

因此,据我所知,我需要以某种方式将可信任的自签名dev证书从本地开发机复制到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.

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

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

所以-有人可以帮忙吗?

我觉得错误消息不正确并且没有显示 real 错误消息吗?


更新

以防万一我弄乱了Docker文件,这是我的2个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/

1 个答案:

答案 0 :(得分:1)

我最近将其用于我的项目。我从生成的Visual Studio Docker Compose文件中窃取了很多内容。

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

首先,您的环境变量-我不确定您使用的是哪个版本的compose。我使用的是3.7,并且可以通过以下方式定义变量:

      ASPNETCORE_ENVIRONMENT: "Development"
      ASPNETCORE_URLS: "https://+:443;http://+:80"
      ASPNETCORE_HTTPS_PORT: "44371"

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

我能够完全按照https://localhost:44371的要求访问应用程序。

我也仍然在compose文件中定义端口,但是我想这里的主要事情是您需要通过ASPNETCORE_URLS环境变量告诉aspnet核心端口是什么。在撰写文件中声明的端口将通知您的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"

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