我实现了一个内部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上发送证书? 是否有可能以同样的方式在两个操作系统上执行此操作?
提前感谢您的任何建议!
答案 0 :(得分:2)
我明白了。 您必须设置Linux环境,因为您必须在Windows上安装证书。
我将证书复制为容器映像(Dockerfile)的一部分:
COPY ExternalCert.pem /etc/ssl/certs/ExternalCert.pem
之后代码就像预期的那样工作