Wie zu verwenden statt SSL3, TLS in einer bestimmten HttpWebRequest?
Meine Bewerbung hat zu sprechen, zu verschiedenen hosts, die über https, und die Standard-Einstellung von ServicePointManager.SecurityProtocol = TLS
mir gut gedient bis zu diesem Tag. Nun habe ich einige hosts, die (wie System.Net
trace-log zeigt) nicht die Antwort auf die erste TLS-handshake-Nachricht, aber halten die zugrunde liegende Verbindung offen, bis es mal aus, werfen Sie eine timeout-exception. Ich habe versucht HttpWebRequest
's timeout, um so viel wie 5 Minuten, mit dem gleichen Ergebnis. Vermutlich sind diese Techniker sind bereit für eine SSL3-handshake, da sowohl IE und Firefox sind in der Lage, eine Verbindung zu diesen hosts nach 30-40 Sekunden Verzögerung. Es scheint einige fallback-Mechanismus in .NET abbaut TLS SSL3, aber es hat nicht zu treten in aus irgendeinem Grund.
FWIW, hier ist die handshake-Nachricht, mein Antrag ist zu senden (eine normale TLS-1.0-CLIENT-HELLO-Nachricht):
00000000 : 16 03 01 00 57 01 00 00-53 03 01 4C 12 39 B4 F9 : ....W...S..L.9..
00000010 : A3 2C 3D EE E1 2A 7A 3E-D2 D6 0D 2E A9 A8 6C 03 : .,=..*z>......l.
00000020 : E7 8F A3 43 0A 73 9C CE-D7 EE CF 00 00 18 00 2F : ...C.s........./
00000030 : 00 35 00 05 00 0A C0 09-C0 0A C0 13 C0 14 00 32 : .5.............2
00000040 : 00 38 00 13 00 04 01 00-00 12 00 0A 00 08 00 06 : .8..............
00000050 : 00 17 00 18 00 19 00 0B-00 02 01 00 : ............
Gibt es eine Möglichkeit zu nutzen, statt SSL3, TLS in einer bestimmten HttpWebRequest
Kraft oder ein fallback? Es scheint, dass ServicePointManager
's Einstellung ist global, und ich würde es wirklich hassen zu müssen, verschlechtert die Sicherheit Protokoll-Einstellung zu SSL3 für die gesamte Anwendung.
- Hast du eigentlich testen Sie Ihre Hypothese, indem Sie ändern die Einstellung für die Verbindung zu SSL3?
- Ja, die Hypothese als richtig erwiesen. Die Gastgeber waren Netware, und es scheint, dass es Netware-Richtlinie bezüglich der unbekannte/ungültige Anfragen nicht zu reagieren, oder geben Sie Fehlermeldungen, die vermutlich zur Verringerung der Angriffsfläche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich
ServicePointManager
Einstellungen sind pro appdomain. Ich konnte mich um das problem zu umgehen, indem eine separate appdomain verwenden nur SSL3, dass mein data collection-ObjektMarshalByRefObject
(beideWebClient
undWebRequest
sind marshal-by-ref, aber besser, reduzieren Sie die Anzahl der cross-appdomain-Anrufe) und erstellen Sie dort ein. Funktionierte perfekt kombiniert mit einem timeout-basierter Erkennung Schema.System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
ServicePointManager
Objekt stammt ausSystem.Net
namespace, und hält eine statisch-Zustand. Also, nur "mit" namespace & executeServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
einmal vor der Durchführung der betreffenden operation(s) funktioniert der trick..NET enthält Bestimmungen, die automatisch sich verhandeln, um niedrigere Versionen des Protokolls. Der Wert von
ServicePointManager.SecurityProtocol
bestimmt das Verhalten. Es kann auf 3 verschiedene Werte:SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls
. Obwohl global, es kann nach Bedarf geändert werden.Kann ich nicht identifizieren, eine Lösung ohne Zugriff auf einen server mit dem gleichen buggy Verhalten. Der einzige Vorschlag, den ich machen kann, ist, zu versuchen, eine Verbindung mit der
Ssl3 | Tls
Einstellung, und wenn das nicht funktioniert, dann wiederholen mit derSsl3
Einstellung. Verringern Sie das Zeitlimit und fangen die timeout-exception und dann den Vorgang wiederholen.BEARBEITEN
Vieles von dem, was ich schrieb in der früheren version dieser Antwort falsch war.
ServicePointManager.SecurityProtocol
muss die gleiche bleiben für die Dauer der Anfrage, also hab ich es auf einen anderen Weg.