2014-01-14 5 views
5

Ich verwende Microsoft Crypto API, um SSL-Verbindungen zu behandeln. Bei der Kommunikation mit Servern, die TLS 1.0 oder höher unterstützen, funktioniert alles einwandfrei, aber wenn ich versuche, mit Servern umzugehen, die nur SSL 3.0 unterstützen, schlägt InitializeSecurityContext() mit dem Fehlercode 0x80090331 (SEC_E_ALGORITHM_MISMATCH) fehl.SSL/TLS-Protokoll Version Fallback-Mechanismus

Ich habe versucht, mit SCHANNEL_CRED Struktur zu spielen, die an AcquireCredentialsHandle() als pAuthData Argument übergeben wird. Insbesondere hat es das Feld grbitEnabledProtocols, das die Menge der unterstützten Protokolle steuern soll. Wenn ich grbitEnabledProtocols=SP_PROT_SSL3 setze, funktioniert alles gut, aber es bricht die Sicherheit, weil ich auch TLS 1.0, 1.1 und 1.2 unterstützen möchte, und es wird unmöglich, mit Servern zu kommunizieren, die SSL 3.0 aus Sicherheitsgründen deaktiviert haben.

Das Problem ist also:

Wenn ich grbitEnabledProtocols=SP_PROT_SSL3TLS1_X gesetzt und versuchen, mit dem Server zu kommunizieren, die SSL 3.0 nur unterstützt, Verbindung startet als TLS 1.2, dann Server mit SSL 3.0-Header und entsprechende Daten reagiert. Von hier aus sollte die Crypto API gemäß dem RFC das Handshake-Verfahren unter Verwendung des SSL 3.0-Protokolls fortsetzen, aber stattdessen schlägt es mit dem Fehler 0x80090331 (SEC_E_ALGORITHM_MISMATCH, der Client und der Server können nicht kommunizieren, da sie keinen gemeinsamen Algorithmus besitzen).

Gibt es eine Möglichkeit, TLS 1.0, 1.1, 1.2 zusammen mit SSL 3.0 in MS Crypto API zu aktivieren?

Antwort

0

zwei Dinge, die Sie als Teil des Debuggens tun können.

1> check gibt es eine Möglichkeit, die unterstützten Protokolle in den von Ihnen verwendeten APIs anzugeben.

2> versuchen Sie, alle möglichen Verschlüsselungs- und Hashing-Algorithmen einzubeziehen.

Diese beiden Optionen sind in Open SSL verfügbar.

der beste Weg ist zu debuggen ist, wireshark zu verwenden und suchen Sie, was genau der Fehlercode SSL-Protokoll sendet.

+0

1> Ich habe versucht, Protokolle zu spezifizieren, und es wird in Frage ausführlich beschrieben. Hast du den Teil gelesen, der grbitEnabledProtocols enthält? Es ist der Ort, an dem man unterstützte Protokolle angeben sollte. 2> Ich habe alle Protokolle und Verschlüsselungen aufgenommen, aber es hat nicht funktioniert. Ich entdeckte, dass OpenSSL das gleiche Problem hat, zumindest gibt es einen Thread mit der gleichen Frage: http://openssl.6102.n7.nabble.com/Need-inputs-suggestions-on-SSL-TLS-protocol-version -fallback-mechanismus-td25597.html –