System.Net.WebRequest支持哪些版本的SSL / TLS?

现在SSL 3被发现容易受到POODLE攻击:

当连接到任何https Uri时,System.Net.WebRequest使用哪个版本的SSL / TLS?

我使用WebRequest连接到多个第三方API。 其中之一已经表示,他们将阻止任何使用SSL 3的请求。但是WebRequest是.Net核心框架(使用4.5)的一部分,所以它使用什么版本并不明显。

当使用System.Net.WebRequest时,您的应用程序将与服务器进行协商,以确定您的应用程序和服务器支持的最高TLS版本,并使用它。 你可以在这里看到更多的细节。

http://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake

如果服务器不支持TLS,则会回退到SSL,因此可能会回退到SSL3。 你可以在这里看到.NET 4.5支持的所有版本:

http://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.110).aspx

为了防止您的应用程序易受POODLE攻击,您可以按照以下说明在应用程序运行的机器上禁用SSL3:

https://serverfault.com/questions/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566

这是一个重要的问题。 SSL 3协议(1996年)由2014年发布的Poodle攻击无可挽回地破坏了.IETF发布了“SSLv3不得使用” 。 networking浏览器正在抛弃它。 Mozilla Firefox和Google Chrome已经这样做了。

在浏览器中检查协议支持的两个优秀工具是SSL Lab的客户端testing和https://www.howsmyssl.com/ 。 后者不需要Javascript,所以你可以从.NET的HttpClient尝试它:

 // set proxy if you need to // WebRequest.DefaultWebProxy = new WebProxy("http://localhost:3128"); File.WriteAllText("howsmyssl-httpclient.html", new HttpClient().GetStringAsync("https://www.howsmyssl.com").Result); // alternative using WebClient for older framework versions // new WebClient().DownloadFile("https://www.howsmyssl.com/", "howsmyssl-webclient.html"); 

结果是诅咒:

您的客户端正在使用TLS 1.0,这是非常古老的,可能会受到BEAST攻击,并且没有可用的最佳密码套件。 另外像AES-GCM和SHA256取代MD5-SHA-1对于TLS 1.0客户端以及更多的现代密码套件是不可用的。

这是关于。 这与2006年的Internet Explorer 7相当。

要准确列出HTTP客户端支持的协议,可以尝试下面的特定于版本的testing服务器:

 var test_servers = new Dictionary<string, string>(); test_servers["SSL 2"] = "https://www.ssllabs.com:10200"; test_servers["SSL 3"] = "https://www.ssllabs.com:10300"; test_servers["TLS 1.0"] = "https://www.ssllabs.com:10301"; test_servers["TLS 1.1"] = "https://www.ssllabs.com:10302"; test_servers["TLS 1.2"] = "https://www.ssllabs.com:10303"; var supported = new Func<string, bool>(url => { try { return new HttpClient().GetAsync(url).Result.IsSuccessStatusCode; } catch { return false; } }); var supported_protocols = test_servers.Where(server => supported(server.Value)); Console.WriteLine(string.Join(", ", supported_protocols.Select(x => x.Key))); 

我正在使用.NET Framework 4.6.2。 我发现HttpClient只支持SSL 3和TLS 1.0。 这是关于。 这与2006年的Internet Explorer 7相当。


更新: HttpClient不支持TLS 1.1和1.2,但是你必须在System.Net.ServicePointManager.SecurityProtocol上手动打开它们。 请参阅https://stackoverflow.com/a/26392698/284795

我不知道为什么它使用错误的协议开箱即用。 这似乎是一个糟糕的设置select,无异于一个重大的安全漏洞(我敢打赌,大量的应用程序不会改变默认)。 我们如何报告?

我也在那里提供了一个答案,但文章@Colonel Panic的更新指的是强制TLS 1.2的build议。 将来,当TLS 1.2被破坏或者刚刚被取代时,将代码粘贴到TLS 1.2将被认为是一个缺陷。 在.NET 4.6中默认启用与TLS1.2的协商。 如果您可以select将源代码升级到.Net 4.6,我会强烈build议您更改为强制TLS 1.2。

如果您强制使用TLS 1.2,则强烈考虑如果您升级到4.6或更高版本的框架,请留下某些types的面包屑以消除该力量。