【问题标题】:SSL Handshake fails from asp.net application - works in browserSSL 握手从 asp.net 应用程序失败 - 在浏览器中工作
【发布时间】:2015-12-17 11:42:16
【问题描述】:

我正在尝试使用System.Net.Http.HttpClient(使用GetStringAsync)进行简单的获取请求。从我的 webapi asp.net 应用程序完成请求时请求失败,但在浏览器和邮递员中它可以正常工作。

请求失败,Authentication failed because the remote party has closed the transport stream.

注意:当使用 TLS 向其他服务器发出 get 请求时,它可以正常工作。

我使用以下内容确认问题出在 ssl 上。使用这两行代码可以使请求生效,但显然禁用证书验证并不是真正的解决方案。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

我使用https://www.ssllabs.com 测试了服务器,似乎 那里一切正常。它支持 TLS 1.1 和 1.2。

为了了解发生了什么,我查看了wireshark中的包,但由于我对ssl了解不多,所以我学的不多。查看浏览器请求中的包,我可以看到它使用的是 TLS 1.2 协议,并且握手看起来是正确的。 下图显示了客户端启动两个单独的 ssl "ClientHello's"。由于某种原因,服务器没有响应 SSL 握手响应。

希望有人能帮我弄清楚发生了什么。

【问题讨论】:

  • 是否使用具有相同证书的 TLS 托管 webapi?

标签: c# asp.net ssl


【解决方案1】:

我使用https://www.ssllabs.com 测试了服务器,似乎一切正常。它支持 TLS 1.1 和 1.2。

您的客户端仅进行 TLS 1.0 握手。如果服务器仅支持 TLS 1.1 和 TLS 1.2 但不支持 TLS 1.0,则连接将失败。由于现代浏览器都支持 TLS 1.2 浏览器都可以工作。

【讨论】:

  • 你是对的。默认情况下,来自 HttpClient 的请求将仅使用旧版本的 SSL / TLS。有关详细信息,请参阅答案here。正如我最初的问题中所述,我确实尝试了链接的解决方案,但由于某种原因它当时不起作用,一定是有其他东西把它搞砸了。
猜你喜欢
  • 2013-03-23
  • 2018-07-28
  • 2012-10-11
  • 2015-03-16
  • 2021-12-28
  • 2018-10-17
  • 2016-04-29
  • 2014-03-05
相关资源
最近更新 更多