OpenSSL: DH-Parameter anzeigen

15

Bei Verwendung von SSL-Chiffren, die sich auf einen diffie hellman-Schlüsselaustausch stützen, ist die Größe des verwendeten privaten Schlüssels von entscheidender Bedeutung für die Sicherheit dieses Schlüsselaustauschs.

Wie kann ich die verwendeten DH-Parameter abfragen, wenn ich mit dem Tool "openssl s_client" eine Verbindung zu einem Server herstelle?


quelle

Antworten:

17

Ich kenne keine einfach zu verwendende Befehlszeilenoption, aber in der openssl s_clientBefehlszeile können Sie die -msgOption hinzufügen , einen hexadezimalen Speicherauszug der Handshake-Nachricht zu erhalten. Dann suchen Sie nach der ServerKeyExchangeNachricht; 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 ServerKeyExchangeFormat 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 ServerKeyExchangeNachricht 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). .

Thomas Pornin
quelle
1
OpenSSL wählt DHE nicht automatisch aus, aber ein App-Rückruf kann. OpenSSL 1.0.2 (Jan. 2015) kann ECDHE optional automatisch auswählen und s_clientzeigt 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).
Dave_thompson_085
Ich benutze openssl 1.0.1e und bekomme keine ServerKeyExchangemit 0c 00 03 0b. Können Sie den genauen Befehl angeben, um die Ausgabe zu erhalten? Ich habe keinen der Handshakes beginnend mit0c
rubo77
Wenn es sich bei der vom Server ausgewählten Chiffresuite nicht um eine DHE- oder ECHDE-Chiffresuite handelt, wird keine ServerKeyExchange-Nachricht angezeigt.
Thomas Pornin
Ich erhalte <<< TLS 1.2 Handshake [Länge 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 gefolgt von 443 Oktetten, die ab dem fünften Oktett einer Länge von 0x1c9 entsprechen. "0300" scheint jedoch 768 Oktette zu bedeuten, während ich sicher bin, dass mein DH-Parameter "nur" 2048 Bit ist.
Law29
1
@ Law29 Das sieht eher aus wie ein ECDHE ServerKeyExchange. Wenn Sie eine elliptische Kurve verwenden, bedeutet "03" "Dies ist eine benannte Kurve. Die nächsten zwei Bytes codieren die Kennung der Kurve." Dann ist "00 17" der Kurvenbezeichner, der NIST P-256 (die am häufigsten verwendete Kurve für ECDHE) ist. Dann ist "41" die öffentliche Punktlänge, was genau der richtige Wert für einen P-256-Punkt im unkomprimierten Format ist. Ein solcher Punkt würde mit einem Byte mit dem Wert 0x04 beginnen, und genau das haben Sie. Zusammenfassend lässt sich sagen, dass Ihr TLS 1.2-Handshake ECDHE und nicht DHE verwendet.
Thomas Pornin
9

Wenn Sie das Zertifikat im PEM-Format haben, können Sie diesen Befehl ausführen. Er sollte eine ordnungsgemäße Ausgabe des Befehls Openssl liefern.

openssl dhparam -inform PEM -in ./imapd.pem -check -text

(Beispielausgabe)
    PKCS # 3 DH-Parameter: (512 Bit)
        prime:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        Generator: 2 (0x2)
DH-Parameter scheinen in Ordnung zu sein.
----- ANFANG DH PARAMETER -----
XXXX
XXXX
----- DH-PARAMETER BEENDEN -----

Hoffe, das ist, was Sie suchen.

David Loh
quelle