gpt4 book ai didi

c# - 通过https的docker中的Asp.Net-Core应用程序

转载 作者:行者123 更新时间:2023-12-02 17:58:56 25 4
gpt4 key购买 nike

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

Following Microsoft's guide我能够从主机访问容器应用程序,并且一切正常,包括SSL。

尝试从Docker环境内部与应用程序通信时发生问题。相同的容器/其他容器在尝试与应用程序通信时会遇到无法验证证书的问题。
在Microsoft的链接示例应用程序中也可以观察到此行为。尝试从容器(curl https://localhost)中 curl 网站总是会产生: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"))我需要在证书的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。

我将为遇到相同问题的任何人简要概述我的步骤:

我跟着this post来信。

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

然后,我都将其 checkin 到源代码管理中,并编辑了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的所有问题。

关于c# - 通过https的docker中的Asp.Net-Core应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60724704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com