现在SSL 3已经被发现容易受到POODLE攻击的影响:
System.Net.WebRequest连接到任何https Uri时使用哪些版本的SSL/TLS?
我使用WebRequest连接到多个第三方API。其中之一已经表示将阻止使用SSL 3的任何请求。但是,因为WebRequest是.NET核心框架(使用4.5)的一部分,所以不明显它使用的是哪个版本。
现在SSL 3已经被发现容易受到POODLE攻击的影响:
System.Net.WebRequest连接到任何https Uri时使用哪些版本的SSL/TLS?
我使用WebRequest连接到多个第三方API。其中之一已经表示将阻止使用SSL 3的任何请求。但是,因为WebRequest是.NET核心框架(使用4.5)的一部分,所以不明显它使用的是哪个版本。
这是一个重要的问题。SSL 3协议(1996)已被2014年发布的Poodle攻击彻底破坏。IETF已经发布了"SSLv3 MUST NOT be used"。Web浏览器正在摒弃它。 Mozilla Firefox和Google Chrome已经这样做了。
检查浏览器协议支持的两个出色工具是SSL实验室的客户端测试和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客户端支持的确切协议,您可以尝试下面针对每个版本的测试服务器:
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://dev59.com/zV8d5IYBdhLWcg3w1FB0#26392698
我不知道为什么它默认使用不安全的协议。这似乎是一个糟糕的设置选择,相当于一个重大的安全漏洞(我敢打赌很多应用程序没有更改默认值)。我们该如何报告这个问题?
SecurityProtocolType.Tls
(因此仅支持 TLS 1.0)的选项。 - James WestgateTLS
实际上是在操作系统/机器级别实现的东西?HTTP 流量不是在那里发生的吗?因此,我认为告诉您的代码使用特定的 TLS 并没有意义,因为这实际上是由操作系统决定的。 - Don Cheadle