82

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

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

我使用 WebRequest 连接到几个 3rd 方 API。其中之一现在表示他们将阻止任何使用 SSL 3 的请求。但 WebRequest 是 .Net 核心框架(使用 4.5)的一部分,因此它使用的版本并不明显。

4

3 回答 3

53

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

用于检查浏览器协议支持的两个优秀工具是SSL Lab 的客户端测试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 攻击,并且没有可用的最佳密码套件。TLS 1.0 客户端以及更多现代密码套件无法使用 AES-GCM 和 SHA256 等替代 MD5-SHA-1 的附加功能。

这很令人担忧。它可与 2006 年的 Internet Explorer 7 相媲美。

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

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

我不知道为什么它使用开箱即用的坏协议。这似乎是一个糟糕的设置选择,相当于一个重大的安全漏洞(我敢打赌,很多应用程序都不会更改默认设置)。我们如何举报?

于 2015-03-23T22:13:14.957 回答
52

使用 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

于 2014-10-17T19:29:28.860 回答
8

我也在那里给出了答案,但@Colonel Panic 的更新提到的文章建议强制使用 TLS 1.2。将来,当 TLS 1.2 受到威胁或刚刚被取代时,将您的代码粘在 TLS 1.2 上将被视为缺陷。默认情况下,.Net 4.6 中启用了与 TLS1.2 的协商。如果您可以选择将源升级到 .Net 4.6,我强烈建议您更改强制 TLS 1.2。

如果您确实强制使用 TLS 1.2,强烈考虑留下某种类型的面包屑,如果您确实升级到 4.6 或更高版本的框架,它将消除这种强制。

于 2016-03-07T18:32:46.590 回答