【问题标题】:Unable to create a dev certificate for an ASP.NET Core Web App in a Docker container无法在 Docker 容器中为 ASP.NET Core Web 应用创建开发证书
【发布时间】:2019-02-09 13:33:49
【问题描述】:

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

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

因此,据我了解,我需要以某种方式将受信任的自签名开发证书从我的 localhost 开发机器复制到 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.

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

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

我觉得错误信息不正确,没有显示真实错误信息?


更新

以防万一我弄乱了我的 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/

【问题讨论】:

  • 这里有更详细的解释:humankode.com/asp-net-core/…
  • 我查看了那个 url/link,感觉它没有针对 aspnet-core 2.1 进行优化......例如全局工具等。
  • 最初可以尝试让 ssl 在没有 docker 的情况下工作..
  • 是的 - 如 OP 中所述,http 和 https 在本地和 docker 之外运行站点时工作。并且强制重定向也可以正常工作。

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


【解决方案1】:

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

我在您的 compose 语法中看到了一些可能导致您的问题的差异。

首先,您的环境变量 - 我不确定您使用的是什么版本的 compose。我使用的是 3.7,并且能够以这种方式定义变量:

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

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

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

我仍然在我的撰写文件中定义端口,但我认为这里的主要内容是您需要通过您的 ASPNETCORE_URLS 环境变量告诉 aspnet 核心端口是什么。 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"

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

【讨论】:

  • 非常感谢您提供的有用答案!首先,你为什么这样做:ASPNETCORE_HTTPS_PORT: "5001"?这不是说应用程序的 HTTPS 端口是 5001 而是我们试图将容器端口 5001 暴露给 app-https 端口 443 ...这不起作用,因为应用程序是设置查看 5001,而不是 443?
  • 该变量的目的是在您将 HTTPS 重定向配置为开启 (app.UseHttpsRedirection()) 时,在客户端尝试访问应用程序时向客户端发出重定向命令。它没有定义容器内的任何端口,它告诉外部客户端“嘿,你试图在 5000 处攻击我,但对于 HTTPS,你必须在 5001 处攻击我。”您可以在标题 HTTPS 重定向下的 github.com/aspnet/Home/issues/2308 找到更多相关信息
  • 请在此处查看我的答案stackoverflow.com/questions/56824859/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2018-08-15
  • 2019-11-05
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2019-02-18
相关资源
最近更新 更多