Ich kenne keine einfach zu verwendende Befehlszeilenoption, aber in der openssl s_client
Befehlszeile können Sie die -msg
Option hinzufügen , einen hexadezimalen Speicherauszug der Handshake-Nachricht zu erhalten. Dann suchen Sie nach der ServerKeyExchange
Nachricht; es sollte so aussehen:
<<< TLS 1.2 Handshake [length 030f], ServerKeyExchange
0c 00 03 0b 01 00 ff ff ff ff ff ff ff ff c9 0f
da a2 21 68 c2 34 c4 c6 62 8b 80 dc 1c d1 29 02
4e 08 8a 67 cc 74 02 0b be a6 3b 13 9b 22 51 4a
(...)
und es liest sich so:
0c 00 03 0b
: Nachricht vom Typ "ServerKeyExchange" (das ist "0c") mit einer Länge von 0x00030B Bytes.
- Das erste Element ist der DH-Modul als große Ganzzahl mit einem Header mit einer Länge von zwei Bytes. Hier wird die Länge als codiert
01 00
, was bedeutet, dass eine ganze Zahl über 0x0100 Bytes codiert ist. Das sind 256 Byte, der Modul hat also eine Länge zwischen 2041 und 2048 Bit.
- Die Modulbytes folgen in vorzeichenloser Big-Endian-Reihenfolge. Die oberen Bytes dieses Moduls sind in diesem Fall
ff ff ff ff...
. Der Modul hat dann genau eine Länge von 2048 Bit.
Wenn Sie eine ECDHE-Verschlüsselungssammlung (elliptische Kurve) verwenden, ist das ServerKeyExchange
Format natürlich anders.
Die Definition der Nachricht finden Sie im StandardServerKeyExchange
. Für DHE-Chiffresuiten enthält es das Modul p , den Generator g und den öffentlichen DH-Schlüssel y des Servers in dieser Reihenfolge, jeweils ausgedrückt als große Ganzzahl im oben beschriebenen Format (16-Bit-Header, der die Länge in Bytes enthält, dann die Ganzzahl) Wert in vorzeichenloser Big-Endian-Codierung).
Neuere OpenSSL-Versionen neigen dazu, eine DH-Modulgröße auszuwählen, die (aus Sicherheitsgründen) der Stärke des Schlüsselpaars des Servers (das zum Signieren der ServerKeyExchange
Nachricht verwendet wird) entspricht. Im obigen Beispiel verfügt der Server über einen 2048-Bit-RSA-Schlüssel. Daher hat OpenSSL die Verwendung eines 2048-Bit-DH-Moduls (in diesem Fall des in RFC 3526, Abschnitt 3, beschriebenen bekannten Moduls ) ausgewählt.
Einige andere Server halten sich an 1024-Bit-DH-Gruppen, um die Kompatibilität mit einigen vorhandenen Clients zu gewährleisten, die keine größeren DH-Gruppen unterstützen (der größte Straftäter ist die SSL-Implementierung in Java, die 2012 in Java 8 Build 56 behoben wurde ). Ein bekannter Fehler im TLS-Protokoll für die DHE-Chiffresuiten besteht darin, dass der Client nicht angeben kann, welche Modulgröße er unterstützen darf (dies ist für ECDHE behoben, da der Client die genaue Liste der akzeptierten Kurven angeben kann). .
s_client
zeigt in 1.0.2 bei Bedarf immer "Temp server key" DH & size oder ECDH & curve an, kurz bevor "handshake x gelesen und y geschrieben hat", sodass Sie dies nicht mehr benötigen um es zu entschlüsseln. Es handelt sich um Apache mod_ssl , das DHE automatisch auswählt: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (in dem das Problem mit Java-Clients erwähnt wird).