使用自签名客户端证书进行HttpClient调用

时间:2018-07-04 14:55:03

标签: .net ssl certificate httpclient

我正在尝试与瑞典付款提供商GetSwish建立集成。出于天才,他们决定使用基于客户端的证书作为身份验证,而不是像地球上其他所有付款提供商一样使用哈希和共享机密。由于某些原因,他们决定使用自签名客户端证书,而不是与comodo,verisign或任何其他CA进行批量交易。

使用HttpClient通过提供的证书连接到服务时,基础HttpClientHandler尝试通过与CA联系来验证证书的有效性。这显然是失败的,因为证书是自签名的。可以通过在服务器证书存储中安装证书来避免这种情况,这会使验证短路。我正在构建的应用程序将托管在证书存储不可用的PAAS环境中。

我目前的想法是从https://github.com/dotnet/corefx派生System.Net.Http命名空间的大部分,并通过删除验证以发出请求而实际上降低了连接的安全性。包含金融交易。它与我的坐姿不太对。

GetSwish开发人员支持的评论是“ Windows总是使事情变得怪异和不规范”,其后根本没有帮助,也很幸运。

在计算机证书存储中安装.p12文件时,以下代码有效: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; X509Certificate2 swishCertificate = new X509Certificate2(System.IO.File.ReadAllBytes("cert1231181189.p12"), "swish", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); HttpClientHandler handler = new PartialHttpClientHandler(); handler.ClientCertificates.Add(swishCertificate); // Validate the server certificate. Because ofcourse it doesn't work properly either. handler.ServerCertificateCustomValidationCallback += ServerCertificateCustomValidationCallback; handler.CheckCertificateRevocationList = false; HttpClient client = new HttpClient(handler);

0 个答案:

没有答案