ASP.NET-基于HTTPS的扩展坞中的核心应用

Asp.Net-Core Application in docker over https(ASP.NET-基于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相关的错误。

考虑到这就像在Windows上一样,您只需将自签名的.pfx添加到证书存储中,我使用以下命令创建了一个自签名证书 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__PathASPNETCORE_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的扩展坞中的核心应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)