如何在Docker容器中配置SSL证书

问题描述 投票:0回答:1

如何在 Docker 容器中为 ASP.NET Core 配置 SSL 证书?

我有一个 Visual Studio 解决方案,其中包含在 Docker Desktop 上运行的多个项目;这是一个用于评估代码的“沙箱”环境。这不是也永远不会是“生产”环境。因此,目的是使配置尽可能简单,以便我可以专注于“实际”工作。 (FWIW 在某些时候我需要为生产重做这个......但这是另一个不同的问题)。

基本的 Visual Studio Docker 容器具有有效的 SSL 证书:例如,在 Web 浏览器中打开

https://localhost:10433
,Web 浏览器会通过有效证书报告连接安全。

运行两个 docker 容器

  • service01(主机名service01.local)
  • service02(主机名service02.local)

容器 service02 通过 https 访问 service01。

问题:

  • 使用
    https://localhost:10433
    从主机访问 service01 上的 https 端口是有效的。
  • 使用
    https://service01.local
    从主机访问 service01 上的 https 端口会引发证书无效警告(您可以在浏览器中覆盖该警告)
  • 使用
    https://service01.local
    从 service02 访问 service01 上的 https 端口失败...(请参阅下面的curl响应)
from host
> ping service01
pinging service01.local [172.26.13.76]
reply from 172.26.13.76 
etc

from service02
> ping service01
pinging service01.local [172.26.13.76]
reply from 172.26.13.76 
etc

from service02
> curl https://service01.local
curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325) - The certificate chain was issued by an authority that is not trusted.

这一切都有道理:

  • https://localhost:port 工作时证书受主机信任。
  • https://service01.local 浏览器不信任证书,因为证书 CN=localhost 而不是 CN=service01.local
  • service02 curl https://service01.local 证书不受信任,因为 service02 尚未被告知信任它并且 CN 错误

基本上,我需要在 service01 容器上获取一个 CN=service01.local 的新自签名证书。

我认为我需要执行以下操作:

  • 在主机上,生成一个新的自签名证书 CN=service01.local
  • 在创建 service01 容器时,将此证书推送到容器中(通过 Dockerfile 或挂载点)
  • 在 service01 容器上,“加载”证书以供 ASP.Core 应用程序使用
  • 在 service02 容器上,“信任”service01 容器上使用的证书

正如我所指出的:这是一个“沙箱”非生产环境,所以快速而肮脏的东西就可以了(即我想避免组合,kubernetes,反向代理,让加密方法;这些工具只是增加了另一层复杂性我现在不想处理)。

到目前为止我已经回顾过的一些相关的 stackoverflow 帖子

docker asp.net-core ssl ssl-certificate docker-container
1个回答
0
投票

几天前就见过这个问题。在service02中使用httpclient时,您可以通过配置httpclienthandler来绕过证书验证。

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>{return true;};
builder.Services.AddScoped(sp => new HttpClient(httpClientHandler));

如果需要,您还可以添加一些验证

httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) => {
    if (cert.GetCertHashString() == "A7E2BA992F4F2BE220559B8A5371F05A00A6E750") //FingerPrint of the certificate
    {
        return true;
    }
    return false;
};
© www.soinside.com 2019 - 2024. All rights reserved.