繁体   English   中英

Docker 中的 Asp.Net-Core 应用程序通过 https

[英]Asp.Net-Core Application in docker over https

我们最近遇到了在 docker 中通过 https 为我们的容器化应用程序提供服务的要求。

按照 Microsoft 的指南,我能够从我的主机访问容器应用程序,并且一切正常,包括 SSL。

尝试从 docker 环境内部与应用程序通信时会发生问题。 同一个容器/其他容器在尝试与应用程序通信时遇到无法验证证书的问题。 在 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:\\LocalMachine\\My" -NotAfter (Get-Date("2050-01-01"))创建了一个自签名证书New-SelfSignedCertificate -DnsName "localhost", "dockerDnsName", "127.0.0.1" -CertStoreLocation "cert:\\LocalMachine\\My" -NotAfter (Get-Date("2050-01-01"))我需要在我证书的 SubjectAlternateName 中的 localhost 和 dockerDnsName 因为来自 docker 网络内的容器将与使用该名称的容器。 然后我将证书添加到我的主机的受信任根 CA。

我按照 Microsoft 的指南将 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 内部提供 (docker-) 并且到主机的端口映射是 5000:5000。

在尝试了更多之后,我最终再次重新完成了整个认证过程。 只是这一次,我一路用了openssl。

我将简要概述我对面临相同问题的任何人的步骤:

我跟着这篇文章写了这封信。

通过这种方式,我设置了一个在 Windows 和 Linux (Docker) 环境中都可以信任的 CA 证书,称为cacert.crt 然后我创建了一个证书签名请求,如链接答案中所述,使用 CA 证书对其进行签名并获得一个有效的 SSL 证书,称为servercert.pfx 该指南仅指定了 .pem 文件,但使用 openssl cli 工具在格式之间进行转换非常简单。

然后,我已将两者都签入到我的源代码管理中并编辑了我的 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

显然,必须根据需要调整实际端口号以及密码值。

这解决了我所有的问题。 现在,所有浏览器都可以愉快地导航到https://localhost:5000 ,它在 docker 中提供服务,没有出现 SSL 错误。 我还可以连接到 docker 容器并运行$ curl https://localhost:5000$ curl https://dockerDnsName:5000没有问题。 这也解决了 HttpClient 的所有问题。

Jejuni 回答的一些附加信息。

将 .pem 文件转换为 .pfx

sudo openssl pkcs12 -export -out servercert.pfx -inkey serverkey.pem -in servercert.pem

还必须编辑其可用性

sudo chmod +r servercert.pfx

在 Arch Linux 上,我将 cacert 添加到受信任的来源

sudo trust anchor --store cacert.pem

最后,经过互联网上的几个误导性指南,本地主机上的 HTTPS 正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM