客户端证书HttpClient .Net Core Docker Linux

时间:2017-12-13 19:34:30

标签: c# linux docker asp.net-core client-certificates

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

在第一个实现中,它是基于.NET Framework的服务(当然是4.6.2的窗口),代码看起来像这样:

        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上发送证书? 是否有可能以同样的方式在两个操作系统上执行此操作?

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:2)

我明白了。 您必须设置Linux环境,因为您必须在Windows上安装证书。

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

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

之后代码就像预期的那样工作