客户端证书 HttpClient .Net Core Docker Linux

Client certificate HttpClient .Net Core Docker Linux

我实现了一个使用另一个(外部)REST 服务的内部 REST 服务。外部服务使用带有客户端证书(和令牌)的 HTTPS 进行保护。

在第一个实现中,它是基于 .NET Framework 的服务(当然是 4.6.2 windows),代码如下所示:

        var certificate = new X509Certificate2("./ExternalCert.pfx", "supersecurepassword764689");
        var httpClientHandler = new HttpClientHandler
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            ClientCertificates =
            {
                certificate
            },
            CookieContainer = this.cookieContainer,
        };
        this.httpClient = new HttpClient(httpClientHandler)
        {
            BaseAddress = new Uri(url)
        };

而且效果很好。现在我们正在切换到 ASP.NET Core 2(基于 .NET Core)和 Docker。在我的 windows 机器上进行开发期间,上面的代码也适用于 .NET Core。

但是现在如果我在 docker 容器中执行它(当然 linux)它就不再工作了(SSL 错误)。 (现在证书被复制到容器镜像中,但它计划用 docker 秘密存储它)。

我做了一些研究,似乎 *.pfx 在 linux 上不起作用,你必须生成一个基于 pfx 的 *.pem 文件。 所以我用这个命令生成了它:

openssl pkcs12 -in ExternalCertificate.pfx -out ExternalCertificate.pem -nodes

之后我替换了以下行:

var certificate = new X509Certificate2("./NewExternalCert.pem", "supersecurepassword764689");

也尝试过:

var certificate = new X509Certificate2(File.ReadAllBytes("./NewExternalCert.pem"), "supersecurepassword764689");

现在我仍然从外部服务收到客户端证书丢失的错误,但在我的应用程序中没有异常。

那我做错了什么?如何在 linux 上发送证书? 有没有可能在两个 OS 上以同样的方式做到这一点?

提前感谢您的任何建议!

我明白了。 您必须设置 linux 环境,因为您必须在 windows.

上安装证书

我将证书复制为容器映像 (Dockerfile) 的一部分:

COPY ExternalCert.pem /etc/ssl/certs/ExternalCert.pem

之后代码按预期运行