Come verificare un pacchetto di scambio di chiavi del server

3

Ho un problema tra due estremità di una connessione SSL. Il server invia ServerKeyExchange e il client dice che il pacchetto di scambio della chiave del server non è firmato correttamente, quindi voglio controllare personalmente la firma.
I pacchetti che ho contengono:

Client:
    ClientHello -> client random
Server:
    ServerHello -> server random
    ServerKeyExchange -> EC Diffie-Hellman Server Parameters
        Signature Hash Algorithm: SHA256,ECDSA

Il mio tentativo:
Per ottenere l'hash che uso

sha256(client_random + server_random + server_params[:signature_index])

Ho estratto il certificato del server e ha l'algoritmo della firma "sha256ECDSA".
Penso di aver bisogno di prendere la firma dei parametri, decifrarla usando la chiave pubblica del server e confrontarla con l'hash.
La riga di comando di openssl non offre la decodifica di ECDSA o non ho trovato come farlo.
In che modo è possibile verificare la firma utilizzando gli strumenti della riga di comando o la quantità minima di codice che posso?

    
posta Dani 21.11.2016 - 18:59
fonte

1 risposta

2

In primo luogo, la firma e la verifica sono NON "crittografano" e "decodificano" l'hash. Quel tropo dannoso è quasi in parte vero per RSA ma non proprio, ed è totalmente sbagliato al 100% per DSA ed ECDSA. Vedi
Cercando di capire RSA e la sua terminologia?
Autenticazione della chiave pubblica: cosa viene firmato?
La crittografia dei dati con una chiave privata è pericolosa? < br> Se la chiave pubblica non può essere usato per decodificare qualcosa criptato dalla chiave privata, quindi come funzionano le firme digitali?
Comprensione delle certificazioni digitali
Firma digitale e V erezione?
Con GPG, puoi" decifrare "un file che non è stato crittografato?
link

Inoltre, il campo dell'algoritmo della firma nel certificato è irrilevante; questo è l'algoritmo per la firma di del certificato da parte della CA, e non la firma sui dati da parte dell'EE (qui il server) utilizzando la chiave certificata.

Detto ciò, ciò che è firmato sono i due valori casuali, più la forma codificata dei parametri del server.

Ecco un esempio. Ho catturato un handshake (test) in Wireshark e qui esporto il messaggio ServerKeyExchange in temp3.raw :

Ho anche esportato il client e il server ciao nonces su temp1.raw e temp2.raw rispettivamente, e subjectPublicKeyInfo dal cert a tempk.raw e convertito in modulo PEM (che OpenSSL preferisce) con openssl pkey -pubin -inform der <tempk.raw >tempk.pem . Ora:

$ xxd temp1.raw
0000000: ead0 1445 aec2 291d e316 8f77 b75c e0ec  ...E..)....w.\..
0000010: 696c ced0 9d45 65b3 78bd d6f8 5e11 287e  il...Ee.x...^.(~
$ xxd temp2.raw
0000000: 5834 4f06 be02 498d cba5 16b0 80bd d5f3  X4O...I.........
0000010: 4a0c 1476 d085 8c57 6fbf 5485 47cd 3937  J..v...Wo.T.G.97
$ xxd temp3.raw
0000000: 0c00 0091 0300 1741 04da 0889 2ed6 bdd0  .......A........
0000010: d140 30e8 417a 7d15 9d46 55b5 6eed 4fde  [email protected]}..FU.n.O.
0000020: 814c a7aa fd1d 6617 2835 75c4 12d4 a2a4  .L....f.(5u.....
0000030: 213e 6141 112c fb8d 620b 21f9 e27f ea54  !>aA.,..b.!....T
0000040: 53ec 9ec1 bbbc b3df 2f06 0300 4830 4602  S......./...H0F.
0000050: 2100 fd47 429f 478b 3bd4 c8d4 ce4a 9e4c  !..GB.G.;....J.L
0000060: f6e0 c957 bf83 017d 0812 bb4a 8fda de06  ...W...}...J....
0000070: ddc0 0221 00e3 05b1 3046 3c32 a387 012f  ...!....0F<2.../
0000080: d149 e810 b423 b45c cce1 e4e9 62ce bd6a  .I...#.\....b..j
0000090: a4a0 b6d2 a3                             .....

Questo ServerKeyExchange è costituito dall'intestazione del messaggio di handshake (4 byte), il valore di curva_name e il valore pubkey qui totalizzano 3 + 1 + 65 = 69 byte, 2 byte di firma e identificatori di hash (solo TLSv1.2, per prima vedere RFC) qui 06 03 significa SHA512 ECDSA, lunghezza 2 byte e firma effettiva 72 byte. Costruisco l'input e separo la firma, e uso la linea di comando OpenSSL per verificare (hash e amp;):

$ (cat temp[12].raw;dd if=temp3.raw bs=1 skip=4 count=69 status=none) >temp.dat
$ dd if=temp3.raw bs=1 skip=77 count=72 status=none >temp.sig
$ openssl sha512 <temp.dat -verify tempk.pem -signature temp.sig
Verified OK
    
risposta data 22.11.2016 - 15:35
fonte

Leggi altre domande sui tag