Asp.Net-Core Application in docker over https(ASP.NET-基于HTTPS的扩展坞中的核心应用)
问题描述
我们最近遇到了通过docker中的HTTPS为我们的容器化应用程序提供服务的要求。
Following Microsoft's guide我能够从我的主机访问容器应用程序,一切正常,包括SSL。
尝试从停靠环境内部与应用程序通信时出现此问题。相同的容器/其他容器在尝试与应用程序通信时遇到无法验证证书的问题。
在Microsoft的链接示例应用程序中也可以观察到这种行为。尝试从容器(curl https://localhost
)中卷曲网站总是会产生:curl: (60) SSL certificate problem: unable to get local issuer certificate
这不是cURL特有的问题,因为使用HttpClient
的调用也会返回与SSL相关的错误。
New-SelfSignedCertificate -DnsName "localhost", "dockerDnsName", "127.0.0.1" -CertStoreLocation "cert:LocalMachineMy" -NotAfter (Get-Date("2050-01-01"))
我需要证书的SubjectAlternateName中的Localhost和dockerDnsName,因为docker网络中的容器将使用该名称与容器进行对话。
然后,我将证书添加到我的主机的受信任的根CA。
我按照微软的指导将PFX添加到容器中,将Kestrel的环境变量设置为相关值(ASPNETCORE_Kestrel__Certificates__Default__Path
和ASPNETCORE_Kestrel__Certificates__Default__Password
),并启动了容器。
从主机通过浏览器访问容器仍然有效。从容器内访问网站时再次产生了SSL错误。
然后,我通过openssl pkcs12 -in myRootCA.pfx -clcerts -nokeys -out myRootCA.crt
在容器内将.pfx转换为.crt,将生成的.crt添加到/usr/local/share/ca-certificates/
并运行update-ca-certificates
。
据我所知,这本应修复它,但我仍然收到相同的与SSL相关的错误。
编辑:不知道是否会有任何不同,但此特定应用程序在内部端口5000处提供服务(扩展坞-),到主机的端口映射是5000:5000。
推荐答案
经过多次尝试后,我最终重新做了整个认证过程。 只是这一次,我一路使用OpenSSL。
我将为面临同样问题的任何人简要概述我的步骤:
我严格遵循this post。
通过这种方式,我设置了一个在Windows和Linux(Docker)环境中都可以信任的CA证书,称为cacert.crt
。然后,我已经创建了一个证书签名请求,如链接答案中所述,使用CA证书对其进行签名,并获得一个名为servercert.pfx
的有效SSL证书。
该指南仅指定了.pem文件,但使用OpenSSLCLI工具在这些格式之间进行转换非常容易。
然后我已将两者签入我的源代码管理,并编辑了我的dockerfile和Compose文件。
然后,我将cacert.crt安装到本地计算机的证书存储中的受信任根颁发机构类别下。
在dockerfile中,我将以下内容放在ENTRYPOINT
之前:
COPY ["servercert.pfx", "/https/servercert.pfx"]
COPY ["cacert.crt", "/usr/local/share/ca-certificates/cacert.crt"]
RUN update-ca-certificates
在docker-compose.yml中,我将以下内容放在environment
下:
- ASPNETCORE_URLS=https://0.0.0.0:5000
- ASPNETCORE_HTTPS_PORT=5000
- ASPNETCORE_Kestrel__Certificates__Default__Password={YourPw}
- ASPNETCORE_Kestrel__Certificates__Default__Path=/https/servercert.pfx
显然,必须根据需要调整实际端口号和密码值。
这解决了我所有的问题。所有浏览器现在都可以愉快地导航到从docker内部提供服务的https://localhost:5000,而不会出现任何SSL错误。
我还可以连接到docker容器并运行$ curl https://localhost:5000
和$ curl https://dockerDnsName:5000
,没有任何问题。这也修复了HttpClient的所有问题。
这篇关于ASP.NET-基于HTTPS的扩展坞中的核心应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:ASP.NET-基于HTTPS的扩展坞中的核心应用
基础教程推荐
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- c# Math.Sqrt 实现 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01