我有一个使用某些Web服务并通过JSON获取数据的App,它们运行了很长时间,直到最新发现SSLv3容易受到中间人攻击并且服务器所有者完全关闭SSLv3为止。我的应用程序开始出现连接问题,并返回错误“请求已中止:无法建立安全的SSL/TLS连接”。我试图寻找解决方案,并找到了在创建Web请求之前必须添加以下代码的信息:

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ServicePointManager.ServerCertificateValidationCallback = delegate{
                    return true;
        };

不幸的是,这里没有运气,应用程序的行为与以前相同,并且我不知道此代码不执行任何操作还是服务器仍然存在问题。错误信息非常模糊,我无法确定问题出在哪里。

这是我的代码
        ...
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ContentType = GetRequestContentType();
        request.Method = method.ToString();
        request.Credentials = GetCredential(url);
        request.PreAuthenticate = true;
        CookieContainer cookieContainer = new CookieContainer();
        request.CookieContainer = cookieContainer;
        ...

我想问一下如何将 Tls12 设置为默认值,并确保在我的最终请求中使用所需的协议(protocol)。

如果我确认我的应用程序可以正常运行,是否可以通过服务器响应获取更详细的信息并查明错误的确切原因?

感谢您的所有答案和建议。

编辑

问题的第二部分解决了,我发现这个工具http://www.telerik.com/download/fiddler几乎可以查看传出和传入数据的状态。该工具还允许解码SSL连接,启用此选项会使我的应用程序开始工作。我假设此应用程序执行的操作使我的应用程序与目标主机之间的通信成为可能。但是我仍然不知道这可能是什么。以及如何使我的应用程序自行正确处理这些连接。

最佳答案

绝望使我不得不检查整个源代码(负责获取互联网数据的部分是第三方,直到它工作正常之前,没有理由对其进行更改),我发现那条线

request.Credentials = GetCredential(url);

在其体内具有的被称为方法
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

因此,我在创建httpwebrequest之前更改该值的所有尝试均被覆盖。将 SecurityProtocolType 更改为 Tls12 使其现在可以正常工作。

关于C#强制HttpWebRequest使用Tls12而不是SSLv3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26417305/

10-11 06:04