OpenSSL: Visualizza i parametri DH


15

Quando si utilizzano i cifrari SSL basandosi su uno scambio di chiavi diffi hellman, la dimensione della chiave privata utilizzata è di cruciale importanza per la sicurezza di tale scambio di chiavi.

Quando mi collego ad un server usando lo strumento "openssl s_client", come posso interrogare i parametri DH usati?

Risposte:


17

Non conosco un parametro della riga di comando facile da usare, ma nella openssl s_clientriga di comando puoi aggiungere l' -msgopzione per ottenere un dump esadecimale del messaggio di handshake. Quindi cerca il ServerKeyExchangemessaggio; Dovrebbe sembrare come questo:

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

e si legge in questo modo:

  • 0c 00 03 0b: messaggio di tipo "ServerKeyExchange" (ovvero "0c") di lunghezza 0x00030B byte.
  • Il primo elemento è il modulo DH come un intero grande, con un'intestazione di lunghezza di due byte. Qui, la lunghezza è codificata come 01 00, il che significa un numero intero codificato su 0x0100 byte. Sono 256 byte, quindi il modulo ha una lunghezza compresa tra 2041 e 2048 bit.
  • Seguono i byte del modulo, in ordine big-endian senza segno. I byte principali di quel modulo sono, in questo caso ff ff ff ff...,. Il modulo ha quindi lunghezza esattamente 2048 bit.

Se usi una suite di cifratura ECDHE (curva ellittica), ServerKeyExchangeovviamente il formato è diverso.

Vedi lo standard per la definizione del ServerKeyExchangemessaggio. Per le suite di crittografia DHE, contiene il modulo p , generatore g e chiave pubblica DH del server y , in quell'ordine, ciascuno espresso come un intero grande nel formato sopra descritto (intestazione a 16 bit che contiene la lunghezza in byte, quindi l'intero valore nella codifica big-endian senza segno).

Le versioni OpenSSL recenti tendono a selezionare una dimensione del modulo DH che corrisponde (dal punto di vista della sicurezza) alla forza della coppia di chiavi del server (utilizzata per firmare il ServerKeyExchangemessaggio). Nell'esempio sopra, il server ha una chiave RSA a 2048 bit, quindi OpenSSL ha scelto di utilizzare un modulo DH a 2048 bit (in questo caso, il noto modulo descritto in RFC 3526, sezione 3 ).

Alcuni altri server si attaccano a gruppi DH a 1024 bit per garantire la compatibilità con alcuni client esistenti che non supportano gruppi DH più grandi (il principale offensore è l'implementazione SSL in Java, risolta in Java 8 build 56 nel 2012). Un difetto noto nel protocollo TLS, per le suite di crittografia DHE, è che il client non ha modo di specificare quale dimensione del modulo può supportare (questo problema è stato risolto per ECDHE, poiché il client può specificare l'elenco esatto delle curve che accetta) .


1
OpenSSL non seleziona automaticamente DHE, ma è possibile richiamare un'app. OpenSSL 1.0.2 (gennaio 2015) può facoltativamente selezionare automaticamente ECDHE , e anche in 1.0.2 s_clientvisualizza sempre "Chiave del server temporaneo" DH & size o ECDH & curve quando applicabile, appena prima di "handshake ha letto x e scritto y", quindi non è più necessario per decodificarlo. È recente Apache mod_ssl che seleziona automaticamente DHE: httpd.apache.org/docs/trunk/mod/mod_ssl.html#sslcertificatefile (che rileva il problema relativo ai client Java).
dave_thompson_085,

Io uso 1.0.1e OpenSSL e non ho ricevuto alcuna ServerKeyExchangecon 0c 00 03 0b. puoi fornire il comando esatto per ottenere l'output? Non ho nessuna delle 0c
strette di

Se la suite di crittografia selezionata dal server non è una suite di crittografia "DHE" o "ECHDE", non verrà visualizzato alcun messaggio ServerKeyExchange.
Thomas Pornin,

Ottengo <<< TLS 1.2 Handshake [lunghezza 01cd], ServerKeyExchange 0c 00 01 c9 03 00 17 41 04 08 5f 82 88 1e e5 b6 seguito da 443 ottetti che corrispondono a una lunghezza di 0x1c9 a partire dal quinto ottetto. Tuttavia "0300" sembra significare 768 ottetti mentre sono sicuro che il mio parametro DH sia "solo" 2048 bit.
Legge 29

1
@ Law29 Questo sembra più un ECDHE ServerKeyExchange. Se si utilizza una curva ellittica, "03" significa "questa è una curva denominata, i due byte successivi codificano l'identificatore della curva". Quindi "00 17" è l'identificatore della curva, che è NIST P-256 (la curva più utilizzata per ECDHE). Quindi "41" è la lunghezza del punto pubblico, che è esattamente il valore corretto per un punto P-256 in formato non compresso; un tale punto inizierebbe con un byte del valore 0x04, ed è esattamente quello che hai. Per riassumere: sembra che la tua stretta di mano TLS 1.2 usi davvero ECDHE, non DHE.
Thomas Pornin,

9

Se si dispone del certificato in formato PEM, è possibile provare questo comando, che dovrebbe fornire un output corretto dal comando Openssl.

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

(Uscita campione)
    Parametri DH PKCS # 3: (512 bit)
        Prime:
            xx: xx: xx: xx
            xx: xx: xx: xx
            xx: xx: xx: xx
        generatore: 2 (0x2)
I parametri DH sembrano essere ok.
----- INIZIA PARAMETRI DH -----
XXXX
XXXX
----- PARAMETRI FINE DH -----

Spero che questo sia ciò che stai cercando.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.