切换到TLS 1.2后,C#app再也无法访问网站 - GetResponse()

时间:2016-02-26 17:39:28

标签: c# .net winforms

我们有一个内部应用程序,可以向我们的供应商站点发出XML调用。出于PCI合规性和安全性原因,他们开始禁用除TLS 1.1和TLS 1.2之外的所有内容。他们已经建立了一个测试网站,我们有这个新要求进行测试。

我们的应用程序(C#,Windows Forms应用程序,.NET 4.5)可以很好地连接到他们当前的站点。 当我尝试调用他们的新测试站点时,它在GetRequestStream()调用失败时使用"基础连接已关闭:发送时发生意外错误。"

如果我更新应用并设置: System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12

然后它由GetRequestStream()获取,并在&{34; GetResponse()调用失败;基础连接已关闭:连接意外关闭。"

我尝试过很多东西,但都没有。我正在设置UserAgent,我尝试设置KeepAlive = false,... 如果我在浏览器中访问供应商URL,我可以很好地完成它。我只是遇到了C#应用

的问题

有什么想法?我显然无法访问他们的服务器。我的机器上有人需要改变吗?

2 个答案:

答案 0 :(得分:0)

我认为您的请求很可能在TLS协商阶段失败。我自己也遇到过类似的问题,通常需要使用网络协议分析器(如wireshark)来跟踪客户端和服务器之间的通信,并确定消息已停止的位置。如果TLS协商失败,服务器将终止连接,您将收到类似于上面的错误。

答案 1 :(得分:0)

测试服务器可能没有正确的SSL证书。如果使用ServerCertificateValidationCallback存在任何SSL验证错误,您可以在.NET中找到。我建议在调试模式下忽略验证错误,如下所示:

#if DEBUG
ServicePointManager.ServerCertificateValidationCallback += ValidationCallback; 
#endif

var webRequest = HttpWebRequest.Create("https://your.url");
...

#if DEBUG
bool ValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
#endif

通过这种方式,您可以在测试时(在调试模式下)忽略任何SSL证书问题,但您可以让生产中的验证机制正常工作(发布模式)。顺便说一下,您可以检查sslPolicyErrors参数,以确切了解是否以及导致验证失败的原因。

更新:问题confirmed的作者认为SSL证书有效,所以我的回答无法直接解决他收到的错误。