我正在尝试与瑞典付款提供商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);