使用C#.Net的TLS 1.2错误:底层连接已关闭:发送时出现意外错误

问题描述:

我有一个c#.net网站,我的网站确实要求银行支付系统。一切都很好,大约3-4天前,但现在我不能请求从我的服务器银行服务器。我收到此错误:“底层连接已关闭:发送时发生意外错误。”当我尝试请求银行。使用C#.Net的TLS 1.2错误:底层连接已关闭:发送时出现意外错误

我收到此错误,当我从.net c#代码请求它。

"The underlying connection was closed: An unexpected error occurred on a send." 

这里是我的代码;

public string Send(string request) 
{ 
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

    try 
    { 
     string postData = ""; 
     string responseData = ""; 
     System.Text.Encoding encoding = System.Text.Encoding.GetEncoding("ISO-8859-9"); 

     postData = "https://xxxxxxxxx.aspx?data=[DATA]"; 
     postData = postData.Replace("[DATA]", request); 
     HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(postData); 
     webReq.Timeout = 60000; 
     webReq.KeepAlive = false; 
     webReq.Method = "GET"; 
     WebResponse webResp = webReq.GetResponse(); 
     Stream respStream = webResp.GetResponseStream(); 

     byte[] buffer = new byte[10000]; 
     int len = 0, r = 1; 
     while (r > 0) 
     { 
      r = respStream.Read(buffer, len, 10000 - len); 
      len += r; 
     } 
     respStream.Close(); 
     responseData = encoding.GetString(buffer, 0, len).Replace("\r", "").Replace("\n", ""); 
     return responseData; 
    } 
    catch (System.Net.Sockets.SocketException ex) 
    { 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 

当我从IE 11

enter image description here enter image description here

尝试当我尝试IE 11我收到此错误,事件查看器中显示错误。

A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 40. 

但这里有一个有趣的事情,Chrome和Firefox可以去同一个地址。

enter image description here

感谢您的帮助!

+0

在故障发生前不久在服务器或应用程序上做了任何更改?是否应用了任何Windows更新?你确定问题不在银行方面吗? – user1666620

+0

我相信问题不在银行方面。如果问题在于银行方面,那么如何成功使用Chrome和Firefox。我高的银行的支持和ms14-066更新最后的mounth离开。如果您上个月执行了更新,并且距上次成功交易已经一个月,我最后一次成功交易日期为 –

+0

,那么您可能想要将更新回滚到以前的版本,并查看是否有效。 – user1666620

银行网站可能会更改其SSL证书或以其他方式更改其安全配置,以便您的客户端在其初始SSL握手/协商“客户端Hello”中发送能够接受的cipher_suites值列表时,消息,与银行(现在)愿意支持的内容不匹配。

Chrome和Firefox(显然)都有自己的一组cipher_suites值,这些值独立于您的操作系统的配置值,这就是为什么当Internet Explorer不是时它们仍然工作。

我建议下载Microsoft Message Analyzer,并使用它来运行SSL协商时发生的跟踪,当您尝试建立到银行网站(在您的C#应用​​程序或Internet Explorer中)的SSL连接失败时。然后,在SSL协商成功(在Firefox或Chrome中)时,运行另一个跟踪。

希望您会看到两条客户端Hello消息之间的一些区别,这些区别可以让您指出失败的SSL协商会导致失败。然后,您应该能够对Windows进行配置更改,以使其成功。IISCrypto是一个很好用的工具(即使对于客户端PC,尽管有“IIS”名称)。

下面两个Windows注册表项管理,你的电脑将采用cipher_suites值:

  • HKLM \ SOFTWARE \政策\微软\加密\配置\ SSL \ 00010002
  • HKLM \系统\ CurrentControlSet \控制\加密\配置\本地\ SSL \ 00010002

下面是今天早些时候我是如何解决一个非常类似的问题给你一个完整的书面记录:http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html