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的扩展坞中的核心应用


基础教程推荐
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01