DHE_RSA Lunghezza pubkey in TLS 1.2?

4

Riepilogo:

Sembra che un client TLS non riesca a negoziare quando il server consegna un pubkey di 127 byte nel messaggio di scambio di chiavi del server DHE_RSA, ma riesce quando passa su un pubkey da 128 byte. Qual è l'accordo con la lunghezza di pubkey, e in particolare, questo comportamento legittimo è da considerarsi parte del server?

Dettagli cruenti:

Ho un client (software sconosciuto) che sta sperimentando guasti intermittenti connessi al mio server TLS (F5, TLS 1.2). Le connessioni riuscite e non riuscite si applicano a Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f) nel server Hello. Tutti i tentativi di connessione raggiungono il server Ciao fatto e le connessioni non riuscite vengono FINNATE dal client immediatamente successivo a quello.

Guardando le acquisizioni di pacchetti, tutti i guasti sembrano coincidere con una "Lunghezza Pubkey" di 127 nell'handshake di Exchange Server Key:

D'altraparte,ogninegoziazioneriuscitaconquestoclienthacomportatouna"lunghezza Pubkey" di 128 nell'handshake di Exchange Server Key:

Ognivoltacheilserverinvialaversionea127byte,ilclientrispondeconunFIN/ACKinvecedelloScambiochiaviclient.Laconclusionecuisiamogiuntièchelalunghezzadelpubkeydi127bytenonèaccettabileperilclient.Holetto RFC 5246 per vedere se riesco a farmi un'idea di cosa è permesso e loro " non utile (almeno per me!):

struct {
    opaque dh_p<1..2^16-1>;
    opaque dh_g<1..2^16-1>;
    opaque dh_Ys<1..2^16-1>;
} ServerDHParams;     /* Ephemeral DH parameters */

 struct {
     select (KeyExchangeAlgorithm) {
         case dhe_rsa:
             ServerDHParams params;
             digitally-signed struct {
                 opaque client_random[32];
                 opaque server_random[32];
                 ServerDHParams params;
              } signed_params;
    };
} ServerKeyExchange;

Quindi le domande specifiche sono:

  1. Qual è l'accordo con la lunghezza di Pubkey nello scambio di chiavi del server DHE_RSA? Nello specifico, 127 vs 128 rappresenta qualcosa come il troncamento a zero per il salvataggio della lunghezza, oppure fornisce veramente una chiave a 127 byte?

  2. Più specificamente, 127 è una lunghezza Pubkey valida che il client dovrebbe essere in grado di gestire, oppure potrebbe rappresentare un problema con il server che richiede l'indirizzamento?

Chiarimento:

Il server in questione è un sistema di bilanciamento del carico F5 che esegue un software aggiornato (11.6), quindi non è solo off-the-shelf ma off-a-reason-high-shelf quando si tratta della provenienza TLS. Questo non vuol dire che non può essere il problema, solo per dire che non è come se stessi rotolando il mio server TLS Lua-over-Django-con-terzo-Rails nel back-end:)

Cosa pensa OpenSSL

Ho lasciato uno script usando openssl s_client per colpire il server ogni minuto durante il fine settimana e ho catturato i pacchetti completi, in modo da poter vedere cosa pensa OpenSSL di questa particolare configurazione del server. E in poche parole, con una lunghezza DHE "Pubkey" di 127 byte, OpenSSL considera la "Chiave temporanea del server" 1024-bit.

Ecco lo scambio di chiavi del server come visualizzato in Wireshark:

Edeccol'outputOpenSSLperquellaconnessione:

$tail-2520151107234244.txt---NoclientcertificateCAnamessentServerTempKey:DH,1024bits---SSLhandshakehasread2014bytesandwritten291bytes---New,TLSv1/SSLv3,CipherisDHE-RSA-AES256-GCM-SHA384Serverpublickeyis2048bitSecureRenegotiationISsupportedCompression:NONEExpansion:NONESSL-Session:Protocol:TLSv1.2Cipher:DHE-RSA-AES256-GCM-SHA384Session-ID:8C48CAD47FC01AF350CF618E21AE9C7E8764BB7C7243D8D6204F95634523EF2FSession-ID-ctx:Master-Key:FB80D1070A3BB2435C2D4E50D6633DA3DE4FDCFA5C8A922E17EC6FB0EDC41E259F55DFC33345B51F9A90568B36CFBB7CKey-Arg:NoneKrb5Principal:NonePSKidentity:NonePSKidentityhint:NoneStartTime:1446957764Timeout:300(sec)Verifyreturncode:21(unabletoverifythefirstcertificate)---$

Quindiè1024o1016bit?Lalunghezza'p'indicalaforzadellachiaveinvecedellalunghezzadiPubkey(ssl.handshake.ys_lenperquellicheseguonoinWireshark)?Doveèdefinito"Server Key Exchange" per Diffie-Hellman? Qualcuno ha trovato abbastanza documentazione per scrivere un parser di Wireshark, se potessi dare un'occhiata al documento che hanno usato forse farò meglio a capire le aspettative intorno a questi campi.

    
posta gowenfawr 06.11.2015 - 22:12
fonte

4 risposte

5

In tutti i tuoi esempi, i tasti tutti DH sono di dimensioni "1024 bit", esattamente. In DH, ci sono i parametri (modulo p , generatore g ), la chiave privata ( x ) e la chiave pubblica ( y ). La relazione è y = g x mod p .

La "lunghezza della chiave" è la dimensione del primo p . In tutti i tuoi casi, p si trova tra 2 1023 e 2 1024 , quindi è un "intero a 1024 bit" e questa è la dimensione della coppia di chiavi DH. Ora, la "chiave pubblica" è di per sé l'intero y che si trova tra 1 e p -1; in particolare, nessuna forza y è maggiore di 2 1023 e questo non è un problema . Il campo "lunghezza pubkey" è la dimensione, in byte, del valore codificato y (in notazione non firmata big-endian). A seconda del valore esatto di p , è previsto che tra 1 / 256th e 1 / 128th di tutte le chiavi pubbliche DH avranno bisogno solo di 127 byte per la loro codifica. Nell'ultimo esempio, il valore y è codificato su 127 byte, il primo è 06 , il che implica che y è tecnicamente un intero di 1011 bit; la lunghezza della chiave DH è ancora di 1024 bit poiché è la dimensione di p .

Quindi, la "lunghezza del pubkey" si riferisce alla lunghezza della chiave pubblica come in "lunghezza della codifica di y ", ma NON come in "lunghezza che indica se la chiave può essere rotta da potenti aggressori".

Apparentemente, alcuni sistemi nel tuo setup (il client, o qualche router / firewall tra client e server - forse il FIN che osservi sul server non viene inviato dal client stesso) sono confusi e non riesce a distinguere il due nozioni di "lunghezza pubkey". Configurare il tuo F5 per utilizzare un modulo più grande per la DH potrebbe aggirare il problema, e potrebbe comunque essere considerato una buona idea (DH a 1024 bit non è ancora possibile rompersi, ma in teoria ti piacerebbe usare DH a 1024 bit non più di te accetterebbe di usare RSA a 1024 bit).

    
risposta data 09.11.2015 - 15:26
fonte
1

Volevo solo riassumere lo stato corrente su questo problema:

  • Un ingegnere F5 ha presentato un errore a Microsoft riguardo a questo problema che può essere trovato qui . Sembra che MS l'abbia accettato e stia lavorando su una soluzione, quindi sembra davvero un problema SCHANNEL.
  • Attualmente l'unica soluzione sembra essere quella di disabilitare i DHE-ciphers.
risposta data 08.02.2016 - 09:30
fonte
1

Heads up - OpenSSL 1.1.0 ha una modifica che ho inviato per risolvere questo problema (vedi PR qui ) ed è stato anche incorporato nel ramo 1.0.2 a partire dal 14 dicembre 2016, quindi sarà disponibile in tutte le future versioni 1.0.2. Sarebbe banale anche il backport a 1.0.1, se necessario.

    
risposta data 19.12.2016 - 07:36
fonte
0

La lunghezza della chiave pubblica dipende dal valore del campo primo. Direi che la dimensione della chiave è inferiore a 128 byte / 1024 bit. Ciò significa che c'è qualcosa di sbagliato nel software sul server.

In linea di principio, per Diffie-Hellman può essere utilizzato qualsiasi numero primo di dimensioni; alla fine il valore sarà usato come un numero. L'uso di una chiave a 127 byte / 1016 bit tuttavia presenta alcuni problemi:

  • non tutto il software è in grado di gestire una particolare dimensione della chiave, a volte il software richiede un multiplo di 8 byte, per esempio;
  • 1024 bit è già una dimensione molto piccola per DH, oggi ti piacerebbe per dimensioni più grandi come 2048 bit.

Per prima cosa contattarei comunque l'organizzazione che ha programmato il server. Anche se una dimensione della chiave a 1016 bit non è direttamente un problema, potrebbe essere un'indicazione di problemi più seri.

    
risposta data 06.11.2015 - 23:58
fonte

Leggi altre domande sui tag