T#1.2 C#.Net出错:底层连接已关闭:发送时发生意外错误

时间:2016-01-15 10:17:38

标签: c# asp.net ssl webclient tls1.2

我有一个c#.net网站,我的网站请求银行支付系统。 3-4天前一切都很好,但现在我无法从我的服务器请求银行服务器。我收到此错误:"底层连接已关闭:发送时发生意外错误。"当我尝试请求银行时。

当我从.net c#code请求时,我收到此错误。

"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时,EventViewer显示错误。

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

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

enter image description here

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

Chrome和Firefox(显然)拥有自己的cipher_suites值集合,这些值与操作系统的配置值无关,这就是为什么当Internet Explorer不工作时它们仍在工作的原因。

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

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

以下两个Windows注册表项管理您的PC将使用的cipher_suites值:

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

以下是我今天早些时候解决了一个类似问题的完整文章:http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in-windows.html

答案 1 :(得分:0)

在服务器上安装TLS1.2之后,我也遇到了同样的问题;解决方案是在Web应用程序的情况下在Application_Start()函数中添加以下代码行,在Windows应用程序的情况下,在Program.cs文件的Main方法中添加以下代码:

Web应用程序:

protected void Application_Start()
    {
        //Add this line
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
        //End
        GlobalConfiguration.Configure(WebApiConfig.Register);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
    }

Windows应用程序:

[STAThread]
    static void Main()
    {
        //Add this line
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
        //End
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Default());
    }