web-dev-qa-db-fra.com

OpenSSL: Afficher les paramètres DH

Lorsque vous utilisez des chiffreurs SSL reposant sur un échange de clé difficile, la taille de la clé privée utilisée revêt une importance cruciale pour la sécurité de cet échange de clé.

Lorsque je me connecte à un serveur à l'aide de l'outil "openssl s_client", comment puis-je interroger les paramètres DH utilisés?

14
Marcel

Je ne connais pas de commutateur de ligne de commande facile à utiliser, mais dans la ligne de commande openssl s_client, vous pouvez ajouter l'option -msg pour obtenir un vidage hexadécimal du message de prise de contact. Ensuite, recherchez le message ServerKeyExchange; ça devrait ressembler à ça:

<<< 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
    (...)

et cela se lit de cette façon:

  • 0c 00 03 0b: message de type "ServerKeyExchange" (c'est le "0c") de longueur 0x00030B octets.
  • Le premier élément est le module DH en tant que grand nombre entier, avec un en-tête de deux octets. Ici, la longueur est codée en tant que 01 00, ce qui signifie un entier codé sur 0x0100 octets. C'est 256 octets, donc le module a une longueur comprise entre 2041 et 2048 bits.
  • Les octets de module suivent, dans l'ordre big-endian non signé. Les octets supérieurs de ce module sont, dans ce cas, ff ff ff ff.... Le module a alors une longueur de 2048 bits exactement.

Si vous utilisez une suite de chiffrement ECDHE (courbe elliptique), le format ServerKeyExchange est évidemment différent.

Voir le standard pour la définition du message ServerKeyExchange. Pour les suites de chiffrement DHE, il contient le module p , le générateur g et la clé publique du serveur DH y , dans cet ordre, chacun étant exprimé sous la forme d'un grand entier dans le format décrit ci-dessus (en-tête de 16 bits contenant la longueur en octets, puis la valeur entière en codage big-endian non signé).

Les versions récentes d'OpenSSL ont tendance à sélectionner une taille de module DH correspondant (du point de vue de la sécurité) à la force de la paire de clés du serveur (utilisé pour signer le message ServerKeyExchange). Dans l'exemple ci-dessus, le serveur a une clé RSA de 2048 bits. OpenSSL a donc choisi d'utiliser un module DH de 2048 bits (dans ce cas, le module connu décrit dans RFC 3526, section 3 ).

Certains autres serveurs utilisent des groupes DH 1024 bits afin de garantir la compatibilité avec certains clients existants qui ne prennent pas en charge des groupes DH plus importants (le principal contrevenant étant l'implémentation SSL en Java, corrigé dans Java 8 build 56 en 2012). Une faille connue dans le protocole TLS, pour les suites de chiffrement DHE, est que le client n'a aucun moyen de spécifier la taille de module qu'il peut prendre en charge (ceci est corrigé pour ECDHE, car le client peut spécifier la liste exacte des courbes qu'il accepte). .

17
Thomas Pornin

Si vous avez le certificat au format PEM, vous pouvez essayer cette commande, elle devrait vous donner une sortie correcte de la commande Openssl.

 openssl dhparam -inform PEM -in ./imapd.pem -check -text 
 
 (Exemple de sortie) 
 PKCS # 3 DH Paramètres: (512 bits) 
 prime: 
 xx: xx: xx: xx 
 xx: xx: xx: xx 
 xx: xx: xx: xx 
 générateur: 2 (0x2) 
 Les paramètres DH semblent être corrects. 
 ----- BEGIN DH PARAMETERS ----- 
 XXXX 
 XXXX 
 ----- PARAMÈTRES DE FIN DH ----- 

J'espère que c'est ce que vous recherchez.

8
David Loh