将HttpWebRequest 强制使用Tls12而不是SSLv3

9

我有一个应用程序,利用一些Web服务并通过JSON获取数据,一切都很好,直到最近发现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设置为默认协议,并确保我发出的请求是使用期望协议。如果我确认我的应用在我的端点正常工作,是否有办法从服务器响应中获取更详细的信息并确定错误的精确原因?谢谢所有答案和建议。
编辑:问题的第二部分已解决,我找到了这个工具http://www.telerik.com/download/fiddler它基本上允许查看出站和入站数据的情况。此外,该工具允许解码SSL连接,启用此选项会使我的应用程序开始工作。我假设此应用程序执行某些操作,使我的应用程序与目标主机之间的通信成为可能。但我仍然不知道它可能是什么。以及如何使我的应用程序能够自行处理这些连接。

1个回答

8

我当时十分绝望,于是不得不检查整个源代码(获取互联网数据的部分是第三方的,一直以来都工作正常,因此没有理由改变它),最终我发现了这行代码。

request.Credentials = GetCredential(url);

在其主体中调用了方法

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

在创建httpwebrequest之前,我尝试更改该值的所有尝试都被覆盖了。将SecurityProtocolType更改为Tls12现在可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接