2010-06-12 3 views
9

Meine Anwendung muss über https mit verschiedenen Hosts kommunizieren, und die Standardeinstellung ServicePointManager.SecurityProtocol = TLS hat mir bis heute gut getan. Jetzt habe ich einige Hosts, die (wie System.Net Trace-Protokoll zeigt) die erste TLS-Handshake-Nachricht nicht beantworten, aber die zugrunde liegende Verbindung offen bleiben, bis es Timeout, eine Zeitüberschreitung Ausnahme auslöst. Ich habe versucht, HttpWebRequest Timeout bis zu 5 Minuten, mit dem gleichen Ergebnis. Vermutlich warten diese Hosts auf einen SSL3-Handshake, da sowohl IE als auch Firefox nach 30-40 Sekunden Verzögerung eine Verbindung zu diesen Hosts herstellen können. Es scheint einige Fallback-Mechanismen in .NET zu geben, die TLS zu SSL3 degradieren, aber es tritt aus irgendeinem Grund nicht in Kraft.Wie verwendet man SSL3 anstelle von TLS in einem bestimmten HttpWebRequest?

FWIW, hier ist die Quittierungsaustauschnachricht meiner Anfrage (ein regelmäßiger TLS 1.0 Client hallo Nachricht) sendet:

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 SSL3 zu verwenden anstelle von TLS in einer bestimmten HttpWebRequest oder einen Rückfall zu zwingen ? Es scheint, dass die Einstellung ServicePointManager global ist, und ich würde es wirklich hassen, die Sicherheitsprotokolleinstellung für die gesamte Anwendung auf SSL3 herabsetzen zu müssen.

+0

Haben Sie Ihre Hypothese tatsächlich getestet, indem Sie die Verbindungseinstellung auf SSL3 geändert haben? – Amnon

+0

Ja, die Hypothese erwies sich als richtig. Die Hosts waren Netware, und es scheint, dass es die Netware-Richtlinie bezüglich nicht erkannter/ungültiger Anfragen ist, nicht zu antworten oder irgendwelche Fehlermeldungen zu geben, vermutlich um die Angriffsfläche zu reduzieren. –

Antwort

12

Tatsächlich sind ServicePointManager Einstellungen per-appdomain. Dadurch konnte ich das Problem umgehen, indem ich eine separate Anwendungsdomäne für die ausschließliche Verwendung von SSL3 erstellte, wodurch mein Datensammlungsobjekt MarshalByRefObject (sowohl WebClient als auch WebRequest marshal-by-ref, sondern besser die Anzahl der Cross-App-Domänen-Aufrufe) wurde. und es dort erschaffen. Perfekt kombiniert mit einem Timeout-basierten Erkennungsschema.

+0

Wo hast du diesen Code geschrieben? 'System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls' –

+0

@AnnishV oder wen es betrifft: Das' ServicePointManager'-Objekt stammt aus dem 'System.Net'-Namespace und behält einen statisch-ähnlichen Zustand bei. Verwenden Sie also nur diesen Namespace & führen Sie 'ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; '* einmal * vor Ausführung der betroffenen Operation (en) macht den Trick. – kmonsoor

3

.NET enthält Bestimmungen zum automatischen Aushandeln auf niedrigere Versionen des Protokolls. Der Wert ServicePointManager.SecurityProtocol bestimmt das Verhalten. Es kann 3 verschiedene Werte annehmen: SecurityProtocol.Ssl3, SecurityProtocol.Tls, or SecurityProtocol.Ssl3 | SecurityProtocol.Tls. Obwohl global, kann es nach Bedarf geändert werden.

Ich kann eine Lösung ohne Zugriff auf einen Server mit dem gleichen fehlerhaften Verhalten nicht identifizieren. Über den einzigen Vorschlag, den ich machen kann, ist, mit der Ssl3 | Tls Einstellung zu verbinden, und wenn das nicht funktioniert, dann versuchen Sie es mit der Ssl3 Einstellung. Versuchen Sie, das Zeitlimit zu verringern und die Zeitüberschreitungsausnahme abzufangen, und versuchen Sie es erneut.

EDIT

Vieles von dem, was ich in der vorherigen Version dieser Antwort schrieb, war falsch.

+3

In einer stark multi-threaded Anwendung ist es keine gute Idee, globale Einstellungen zu ändern und 'ServicePointManager.SecurityProtocol' muss für die Dauer der Anfrage gleich bleiben, also habe ich es anders gemacht. –

Verwandte Themen