C# 应用程序在切换到 TLS 1.2 后无法再访问网站 - 在 GetResponse() 上失败
本文关键字:网站 访问 GetResponse 失败 应用程序 TLS | 更新日期: 2023-09-27 18:36:20
我们有一个内部应用程序,可以对我们的供应商站点进行XML调用。出于PCI合规性和安全原因,他们开始禁用除TLS 1.1和TLS 1.2之外的所有内容。他们建立了一个具有此新要求的测试站点,供我们进行测试。
我们的应用程序(C#,Windows 窗体应用程序,.NET 4.5)可以很好地连接到其当前站点。当我尝试调用他们的新测试站点时,它在GetRequestStream()
调用中失败,并显示"基础连接已关闭:发送时发生意外错误"。
如果我更新应用程序并设置:System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
然后,它通过GetRequestStream()
并在GetResponse()
调用中失败,并显示"基础连接已关闭:连接已意外关闭"。
我尝试了很多东西,但没有一个奏效。我正在设置用户代理,我尝试设置KeepAlive=假,...如果我在浏览器中访问供应商 URL,我可以很好地访问它。我只是在C#
应用程序上遇到问题
有什么想法吗?我显然无法访问他们的服务器。我的计算机上是否有我需要更改的设置?
我认为您的请求很可能在TLS协商阶段失败。我自己也遇到过类似的问题,通常归结为必须使用网络协议分析器(例如wireshark)来跟踪客户端和服务器之间的通信并确定消息传递停止的位置。如果 TLS 协商失败,服务器将终止连接,您将收到类似于上述错误。
测试服务器可能没有正确的 SSL 证书。您可以使用 ServerCertificateValidationCallback 在 .NET 中查找是否存在任何 SSL 验证错误。我建议在调试模式下忽略验证错误,如下所示:
#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
参数以准确查看是否以及导致验证失败的原因。
更新:问题的作者确认SSL证书有效,因此我的回答对他收到的错误没有直接帮助。