我们有一个内部应用程序,可以向我们的供应商站点发出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#
应用
有什么想法?我显然无法访问他们的服务器。我的机器上有人需要改变吗?
答案 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证书有效,所以我的回答无法直接解决他收到的错误。