我正在尝试与瑞典支付提供商GetSwish Build 集成 . 天才之后,他们决定使用基于客户端的证书作为身份验证,而不是哈希和共享秘密,就像地球上的其他所有支付提供商一样 . 出于某种原因,他们决定使用自签名客户端证书,而不是与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);