Jej*_*uni 10 c# ssl-certificate docker asp.net-core
我们最近遇到了在 docker 中通过 https 为我们的容器化应用程序提供服务的要求。
按照 Microsoft 的指南,我能够从我的主机访问容器应用程序,并且一切正常,包括 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 network 将使用该名称与容器通信。然后我将证书添加到我的主机的受信任根 CA。
我按照 Microsoft 的指南将 pfx 添加到容器,将 Kestrel 的环境变量设置为相关值(ASPNETCORE_Kestrel__Certificates__Default__Path和ASPNETCORE_Kestrel__Certificates__Default__Password)并启动容器。
从主机通过浏览器访问容器仍然有效。从容器内访问网站再次产生 SSL 错误。然后我将 .pfx 转换为容器内的 .crt 通过openssl pkcs12 -in myRootCA.pfx -clcerts -nokeys -out myRootCA.crt,将生成的 .crt 添加到/usr/local/share/ca-certificates/并运行update-ca-certificates。据我所知,应该已经修复了它,但我仍然遇到相同的 SSL 相关错误。
编辑:不知道它是否有任何区别,但是这个特定的应用程序在端口 5000 内部提供 (docker-) 并且到主机的端口映射是 5000:5000。
Jej*_*uni 11
在尝试了更多之后,我最终再次重新完成了整个认证过程。只是这一次,我一路用了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
Run Code Online (Sandbox Code Playgroud)
在 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
Run Code Online (Sandbox Code Playgroud)
显然,必须根据需要调整实际端口号以及密码值。
这解决了我所有的问题。现在,所有浏览器都可以愉快地导航到https://localhost:5000,它在 docker 中提供服务,没有出现 SSL 错误。我还可以连接到泊坞窗容器和运行$ 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
Run Code Online (Sandbox Code Playgroud)
还必须编辑其可用性
sudo chmod +r servercert.pfx
Run Code Online (Sandbox Code Playgroud)
在 Arch Linux 上,我将 cacert 添加到可信来源
sudo trust anchor --store cacert.pem
Run Code Online (Sandbox Code Playgroud)
最后,经过互联网上的几次误导性指南后,本地主机上的 HTTPS 可以正常工作了。
| 归档时间: |
|
| 查看次数: |
6397 次 |
| 最近记录: |