webentwicklung-frage-antwort-db.com.de

Welche Versionen von SSL / TLS unterstützt System.Net.WebRequest?

Jetzt, da festgestellt wurde, dass SSL 3 für den [~ # ~] Pudelangriff [~ # ~] anfällig ist:

Welche Versionen von SSL/TLS verwendet System.Net.WebRequest, wenn eine Verbindung zu einem https-Uri hergestellt wird?

Ich verwende WebRequest, um eine Verbindung zu mehreren APIs von Drittanbietern herzustellen. Einer von diesen hat jetzt angekündigt, dass er alle Anforderungen blockieren wird, die SSL 3 verwenden. WebRequest ist jedoch Teil des .NET-Kernframeworks (unter Verwendung von 4.5), sodass nicht klar ist, welche Version verwendet wird.

77
JK.

Bei Verwendung von System.Net.WebRequest verhandelt Ihre Anwendung mit dem Server, um die höchste TLS-Version zu ermitteln, die sowohl Ihre Anwendung als auch der Server unterstützen, und verwendet diese. Weitere Details zur Funktionsweise finden Sie hier:

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

Wenn der Server TLS nicht unterstützt, wird er auf SSL zurückgreifen, daher kann er möglicherweise auf SSL3 zurückgreifen. Sie können alle von .NET 4.5 unterstützten Versionen hier sehen:

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

Um zu verhindern, dass Ihre Anwendung für POODLE anfällig ist, können Sie SSL3 auf dem Computer deaktivieren, auf dem Ihre Anwendung ausgeführt wird.

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

47
Gareth Williams

Dies ist eine wichtige Frage. Das SSL 3-Protokoll (1996) wird durch den 2014 veröffentlichten Pudelangriff irreparabel gebrochen. Die IETF hat veröffentlicht "SSLv3 MUSS NICHT verwendet werden" . Webbrowser machen Schluss damit. Mozilla Firefox und Google Chrome haben dies bereits getan.

Zwei hervorragende Tools zum Überprüfen der Protokollunterstützung in Browsern sind Client-Test von SSL Lab und https://www.howsmyssl.com/ . Letzteres erfordert kein Javascript, daher können Sie es über .NET's HttpClient ausprobieren:

// 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");

Das Ergebnis ist verdammt:

Ihr Client verwendet TLS 1.0, das sehr alt ist, möglicherweise für BEAST-Angriffe anfällig ist und nicht über die besten verfügbaren Chiffresuiten verfügt. Ergänzungen wie AES-GCM und SHA256 als Ersatz für MD5-SHA-1 sind für einen TLS 1.0-Client sowie für viele weitere moderne Verschlüsselungssuiten nicht verfügbar.

Das ist besorgniserregend. Es ist vergleichbar mit dem Internet Explorer 7 von 2006.

Um genau anzugeben, welche Protokolle ein HTTP-Client unterstützt, können Sie die folgenden versionsspezifischen Testserver verwenden:

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)));

Ich verwende .NET Framework 4.6.2. Ich fand, dass HttpClient nur SSL 3 und TLS 1.0 unterstützt. Das ist besorgniserregend. Dies ist vergleichbar mit dem Internet Explorer 7 von 2006.


Update: Es stellt sich heraus, dass HttpClient TLS 1.1 und 1.2 unterstützt, aber Sie müssen sie manuell unter System.Net.ServicePointManager.SecurityProtocol . Siehe https://stackoverflow.com/a/26392698/284795

Ich weiß nicht, warum es standardmäßig schlechte Protokolle verwendet. Das scheint eine schlechte Wahl für das Setup zu sein, was einem großen Sicherheitsfehler gleichkommt (ich wette, viele Anwendungen ändern nicht die Standardeinstellungen). Wie können wir das melden?

49
Colonel Panic

Ich habe dort auch eine Antwort hinterlegt, aber der Artikel in @Colonel Panics Update bezieht sich auf das Erzwingen von TLS 1.2. Wenn in Zukunft TLS 1.2 kompromittiert oder einfach abgelöst wird, wird es als ein Mangel angesehen, wenn Ihr Code an TLS 1.2 haftet. Die Aushandlung von TLS1.2 ist in .Net 4.6 standardmäßig aktiviert. Wenn Sie die Option haben, Ihre Quelle auf .Net 4.6 zu aktualisieren, würde ich dringend empfehlen, TLS 1.2 zu erzwingen.

Wenn Sie TLS 1.2 erzwingen, sollten Sie unbedingt eine Art Breadcrumb belassen, die diese Kraft entfernt, wenn Sie ein Upgrade auf das Framework 4.6 oder höher durchführen.