客户端证书HttpClient .Net核心Docker Linux

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

在第一个实现中,它是一个基于.NET Framework(当然是windows的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上的证书? 有没有可能在两个操作系统上做到这一点?

提前感谢您的任何build议!

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

我将这些证书作为容器镜像(Dockerfile)的一部分进行复制:

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

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

Interesting Posts