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


81

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

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

我使用WebRequest连接到多个第三方API。其中一位表示,他们将阻止使用SSL 3的任何请求。但是WebRequest是.Net核心框架的一部分(使用4.5),因此不清楚使用的是哪个版本。


如果服务器(或中间人)请求,WebRequest会回退到SSL 3吗?
菲利普·皮特尔

如果我没记错的话,我认为WebRequest会查看您尝试提取的服务器上的安全证书,并使用Web服务器上的任何加密模式。我认为您不需要在客户端进行任何更改。
Icemanind

1
我希望刚才说他们将不支持SSL3的API的所有者考虑过确保自己的服务器不要求客户端使用SSL3 :)
JK。

@iceman是否可以通过证书告诉它是否支持SSL3?我没有看到任何与版本相关的属性。
JK。

@JK。-我不确定其他浏览器,但我使用的是Chrome。在Chrome浏览器中,如果您访问HTTPS网站(例如Wellsfargo.com),则URL旁会显示一个绿色的锁。单击该锁,然后单击连接选项卡,它将显示给您。对于wellsfargo.com,Chrome会显示“连接使用TLS 1.0”。IE和其他浏览器应显示相同的内容。
Icemanind

Answers:


51

使用System.Net.WebRequest时,您的应用程序将与服务器协商以确定应用程序和服务器均支持的最高TLS版本,并使用此版本。您可以在此处查看有关其工作原理的更多详细信息:

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

如果服务器不支持TLS,它将回退到SSL,因此可能会回退到SSL3。您可以在此处查看.NET 4.5支持的所有版本:

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

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

/server/637207/on-iis-how-do-i-patch-the-ssl-3-0-poodle-vulnerability-cve-2014-3566


20
我建议为了使WebRequest和HttpWebRequest之类的出站请求安全,应按照步骤在stackoverflow.com/questions/26389899/…中禁用SSL回退,以确保安全。基本上,您首先运行以下代码行:System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 据我了解,此答案中详细介绍的注册表修复仅适用于入站连接。
约旦·里格

1
请注意,SecurityProtocolType.Tls在.net framework 3.5或更低版本中,您只能选择(因此TLS 1.0)
James Westgate 2015年

通过放弃System.Net.WebRequest并使用其他库(例如RestSharp)可以获得更高的TLS支持,还是需要升级的实际.net框架?
松饼人

我相信这是需要升级的实际.net框架。www.passionatecoder.ca
Ehsan

1
@JamesWestgate我给人的印象TLS是实际上可以在OS /机器级别上实现?这不是实际的HTTP通信发生的地方吗?因此,我认为尝试告诉您的代码使用由操作系统真正确定的特定TLS并没有任何意义。
唐·奇德尔

52

这是一个重要的问题。SSL 3协议(1996)受到2014年发布的Poodle攻击的不可挽回的破坏。IETF已发布“不得使用SSLv3”。Web浏览器正在抛弃它。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

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


我必须使用哪种协议
Kiquenet '18 -4-12

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或更高版本的框架,则它将消除该强制。


2
“默认情况下在.Net 4.6中启用了对TLS1.2的协商”您是否有与此相关的文档?
felickz

2
当时,我们找到了不确定的文档来暗示此功能(请参见示例上方的msdn.microsoft.com/en-us/library/…)。但是,我们通过使用锁定到TLS 1.2的服务器创建测试程序并使用webrequest尝试下载页面来验证这一点。然后,我们在程序上更改了框架版本。所有下层版本均无法连接,但是.Net 4.6连接没有问题。
冯·莱蒙加格尔教授

感谢您提供的详细信息,我看到很多API提供商都指出4.5无法连接到TLS 1.2,但是我努力提供任何官方文档,不得不依靠社区:)
felickz 2016年

这是正确的方法。我们有许多较旧的服务器正在与Web端点通信,这些服务器现在坚持使用TLS。Web服务引用开始因SSL / TLS错误而失败。您可以修改注册表,但是将服务器升级到最新的.NET版本更加容易和安全。
尼尔·拉斯莱特,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.