我有一个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尝试时,我收到此错误。
当我尝试IE 11时,EventViewer显示错误。
A fatal alert was received from the remote endpoint. The TLS protocol defined fatal alert code is 40.
但这里有一个有趣的事情,Chrome和Firefox可以同样地址。
感谢您的帮助!
答案 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值:
以下是我今天早些时候解决了一个类似问题的完整文章: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());
}