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

81

Nachdem festgestellt wurde, dass SSL 3 für den POODLE- Angriff anfällig ist :

Welche SSL / TLS-Versionen 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. Eine davon hat jetzt angekündigt, dass sie jede Anforderung blockieren wird, die SSL 3 verwendet. WebRequest ist jedoch Teil des .Net-Kernframeworks (unter Verwendung von 4.5), sodass nicht klar ist, welche Version verwendet wird.

JK.
quelle
Wird die WebRequest auf SSL 3 zurückgreifen, wenn der Server (oder der Mann in der Mitte) dies anfordert?
Philip Pittle
Wenn ich mich nicht irre, überprüft WebRequest das Sicherheitszertifikat auf dem Server, den Sie abrufen möchten, und verwendet das Verschlüsselungsschema auf dem Webserver. Ich glaube nicht, dass Sie auf der Client-Seite etwas ändern müssen.
Icemanind
1
Ich würde hoffen, dass die Eigentümer der API, die gerade gesagt haben, dass sie SSL3 nicht unterstützen, darüber nachgedacht haben, sicherzustellen, dass ihr Server nicht verlangt, dass der Client SSL3 verwendet :)
JK.
@iceman eine Möglichkeit, anhand eines Zertifikats festzustellen, ob es SSL3 unterstützt oder nicht? Ich sehe keine Eigenschaften in Bezug auf Versionen.
JK.
@JK. - Bei anderen Browsern bin ich mir nicht sicher, aber ich verwende Chrome. Wenn Sie in Chrome eine HTTPS-Website aufrufen (z. B. Wellsfargo.com), wird neben der URL ein grünes Schloss angezeigt. Klicken Sie auf dieses Schloss und dann auf die Registerkarte Verbindung. Es wird angezeigt. Im Fall von wellsfargo.com sagt Chrome "Die Verbindung verwendet TLS 1.0". IE und andere Browser sollten dasselbe anzeigen.
Icemanind

Antworten:

51

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

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

Wenn der Server TLS nicht unterstützt, wird auf SSL zurückgegriffen, daher kann möglicherweise auf SSL3 zurückgegriffen werden. 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, indem Sie die folgenden Erläuterungen befolgen:

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

Gareth Williams
quelle
20
Ich würde vorschlagen, dass Sie, um ausgehende Anforderungen wie WebRequest und HttpWebRequest sicher zu machen, die Schritte zum Deaktivieren des SSL-Fallbacks befolgen, wie in meiner Frage unter stackoverflow.com/questions/26389899/… beschrieben . Grundsätzlich führen Sie zuerst diese Codezeile aus: System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; Soweit ich weiß, gilt der in dieser Antwort beschriebene Registrierungsfix nur für eingehende Verbindungen.
Jordan Rieger
1
Beachten Sie, dass Sie nur die Option SecurityProtocolType.Tls(und damit TLS 1.0) in .net Framework 3.5 oder niedriger haben
James Westgate
Könnte ich eine höhere TLS-Unterstützung erhalten, indem ich System.Net.WebRequest fallen lasse und eine andere Bibliothek wie RestSharp verwende, oder ist es das eigentliche .net-Framework, das aktualisiert werden muss?
Der Muffin-Mann
Ich glaube, dies ist das eigentliche .net-Framework, das aktualisiert werden muss. www.passionatecoder.ca
Ehsan
1
@ JamesWestgate Ich hatte den Eindruck, TLSdass dies tatsächlich auf Betriebssystem- / Maschinenebene implementiert werden würde. Tritt dort nicht der eigentliche HTTP-Verkehr auf? Daher halte ich es nicht für sinnvoll, Ihren Code anzuweisen, ein bestimmtes TLS zu verwenden, das wirklich vom Betriebssystem bestimmt wird.
Don Cheadle
52

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

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

// 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 Cipher Suites nicht verfügbar.

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

Um genau aufzulisten, welche Protokolle ein HTTP-Client unterstützt, können Sie die folgenden versionenspezifischen Testserver ausprobieren:

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, Sie müssen sie jedoch manuell um aktivieren System.Net.ServicePointManager.SecurityProtocol. Siehe https://stackoverflow.com/a/26392698/284795

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

Oberst Panik
quelle
Welches Protokoll muss ich verwenden ?
Kiquenet
8

Ich habe dort auch eine Antwort gegeben, aber der Artikel, den das Update von @Colonel Panic enthält, schlägt vor, TLS 1.2 zu erzwingen. Wenn TLS 1.2 in Zukunft kompromittiert oder nur ersetzt wird, wird es als Mangel angesehen, wenn Ihr Code an TLS 1.2 festhält. 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, der diese Kraft entfernt, wenn Sie auf das Framework 4.6 oder höher aktualisieren.

Prof. Von Lemongargle
quelle
2
"Die Aushandlung von TLS1.2 ist in .Net 4.6 standardmäßig aktiviert" Haben Sie Dokumentation dazu?
Felickz
2
Zu diesem Zeitpunkt fanden wir eine nicht schlüssige Dokumentation, die auf diese Funktion hinwies (siehe msdn.microsoft.com/en-us/library/… direkt über den Beispielen). Wir haben dies jedoch überprüft, indem wir ein Testprogramm mit einem Server erstellt haben, der auf TLS 1.2 gesperrt war, und mithilfe einer Webanforderung versucht haben, eine Seite herunterzuladen. Dann haben wir die Framework-Versionen des Programms geändert. Alle Downlevel-Versionen konnten keine Verbindung herstellen, aber .Net 4.6 konnte problemlos verbunden werden.
Prof. Von Lemongargle
Vielen Dank für die Details, ich sehe so viele API-Anbieter, die darauf hinweisen, dass 4.5 keine Verbindung zu TLS 1.2 herstellt, aber ich hatte
Mühe,
Dies ist richtig und der richtige Weg. Wir haben eine Reihe älterer Server, die mit Webendpunkten sprechen, die jetzt auf TLS bestehen. Webdienstreferenzen schlugen mit SSL / TLS-Fehlern fehl. Sie können die Registrierung hacken, aber das Upgrade des Servers auf die neueste .NET-Version ist einfacher und sicherer.
Neil Laslett