【问题标题】:.NET: HttpClient object seems to ignore certificate authority for server certificate validation: Do I miss something?.NET:HttpClient 对象似乎忽略了服务器证书验证的证书颁发机构:我错过了什么吗?
【发布时间】:2018-10-19 09:01:02
【问题描述】:

我有以下情况:我使用 System.Net.Http.HttpClient (.Net Fx 4.7.1) 对象访问使用 SSL/TLS 的 URL。服务器的证书应该是受信任的,因为它是由公司的 PKI 基础设施签名的,并且我的同事已经更新了客户端计算机的证书存储以信任它。

但是,如果我使用浏览器 (IE/Chrome) 打开 URL,则连接是可信的,当我使用 HttpClient 对象访问相同的 URL 时,我会收到以下错误链:

AggregateException:发生一个或多个错误。 HttpRequestException:发送请求时发生错误。 WebException:基础连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。 AuthenticationException: 根据验证程序,远程证书无效。

看来,浏览器(Internet Explorer/Chrome)确实有另一个“验证程序”作为 HttpClient 对象。

如果对https://google.com 进行测试,一切正常。

我是否需要告诉 HttpClient 对象它需要处理存储在计算机帐户中的受信任权限? 另一方面,我没有找到任何属性。

我知道如何使用 ServerCertificateVALidateionCallback 绕过异常,但由于我需要安全且受信任的连接,因此这只是用于测试的解决方案。

有什么想法吗?非常感谢! 祝大家玩得开心!

【问题讨论】:

  • 如果您创建验证回调,您可以检查 SslPolicyFlags 和 X509Chain 对象以找出失败的原因。但是如果 IE 说它很好,那么 .NET 应该说它很好(除非服务器是多宿主的并且使用 SNI 选择证书,因为可能 .NET 还没有设置该选项)

标签: .net ssl https ssl-certificate


【解决方案1】:

谢谢你,bartonjs

已解决 - 发现我做错了什么:证书及其链都很好,我的错误是,我仍然订阅了 ServicePointManager.ServerCertificateValidationCallback(...) 并且我目前在那里返回 false,因为我认为只有在证书验证失败时才会调用 ServerCertificateValidationCallback,但实际上该方法旨在进行自己的验证,因此当然总是会调用它。

感谢您为我指明了正确的方向 - 这是正确的靶心...

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2017-10-07
    • 2014-12-26
    • 2012-04-18
    • 2018-07-30
    • 2016-01-01
    • 2011-03-08
    • 2021-04-13
    相关资源
    最近更新 更多