我正在尝试创建一个在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/
答案 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(只读)指示符,因为这似乎是最佳做法。