Determina se la chiave privata appartiene al certificato?

38

Dato un certificato¹ e un file di chiave privata², come posso determinare se la chiave pubblica sul certificato corrisponde alla chiave privata?

Il mio pensiero iniziale era semplicemente criptare del testo con la chiave pubblica sul certificato e tentare di decodificarlo con la chiave privata. Se si tratta di roundtrip, abbiamo un vincitore. Non riesco proprio a capire come farlo con OpenSSL.

In alternativa, se potessi generare la chiave pubblica dalla chiave privata, potrei semplicemente confrontare le loro impronte digitali. SSH sembra avere un comando per questo ( ssh-keygen -y -f my_key > my_key.pub ), ma gli hash non corrispondono. (Sono quasi certo che ho la chiave corrispondente al certificato, come il server web sta servendo con esso, ma mi piacerebbe un modo più semplice per far girare un server da controllare.)

¹ un file .crt, in formato x509, penso. OpenSSL può leggerlo con openssl x509 -text -in that_cert.crt
² Una chiave privata RSA

    
posta Thanatos 26.04.2014 - 05:11
fonte

2 risposte

48

Suppongo che tu abbia ssl.crt e ssl.key nella tua directory corrente.

Se vuoi vedere cosa c'è nel tuo certificato è

# openssl x509 -in ssl.crt -text -noout

Due delle cose qui dentro saranno il modulo e l'esponente della chiave pubblica della RSA (in hex).

Se vuoi vedere cosa c'è nella tua chiave privata è

# openssl rsa -in ssl.key -text -noout

Si noti che la chiave pubblica è di solito lì (per lo meno è necessario che il modulo sia lì per far funzionare la chiave privata, e l'esponente pubblico è in genere 65537 o 3). Quindi puoi semplicemente verificare se il modulo e l'esponente pubblico corrispondono. Certo, se vuoi verificare che la chiave privata sia effettivamente valida (cioè d ed e sono esponenti RSA validi per il modulo m), dovresti eseguire

# openssl rsa -check -in ssl.key -noout

EDIT (2018): Si noti che se si verifica che una chiave privata proveniente da una fonte non affidabile corrisponda a un certificato, è necessario VERIFICARE che la chiave privata sia valida. Vedi qui per un esempio in cui non controllare la validità di una chiave privata "trapelata" porta a una CA che revoca un certificato in modo improprio. Puoi saltare questo passaggio se sai di aver generato validamente la coppia di chiavi.

Ora puoi semplicemente generare la chiave pubblica sia dal certificato che dalla chiave privata e quindi utilizzare diff per verificare che non differiscano:

# openssl x509 -in ssl.crt -pubkey -noout > from_crt.pub
# openssl rsa -in ssl.key -pubout > from_key.pub
# diff from_crt.pub from_key.pub

O come un unico rivestimento che non crea file (usando sostituzione del processo ):

# diff  <(openssl x509 -in ssl.crt -pubkey -noout) <(openssl rsa -in ssl.key -pubout)

Se i tasti corrispondono, diff non dovrebbe restituire nulla. (Probabilmente vedrai "scrivere la chiave RSA" in output su stderr dal secondo comando).

Nota che il tuo server web probabilmente si lamenterebbe rumorosamente se il certificato e la chiave privata non corrispondessero. Ad esempio, con nginx che utilizza la chiave errata (stessa dimensione, stesso esponente pubblico, ma la chiave dell'anno scorso) per il certificato nginx sta usando:

# sudo /etc/init.d/nginx restart
* Restarting nginx nginx                                                                                         
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/private/wrong_key.key") failed 
(SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed
    
risposta data 26.04.2014 - 06:03
fonte
10

La risposta accettata è corretta, ma funziona solo con le chiavi RSA. Dovrà essere modificato per abbinare altri tipi di chiavi.

Invece, ecco un one-liner che funziona per tutti i tipi di chiavi supportati da openssl.

 cmp <(openssl x509 -pubkey -in certificate.pem -noout) <(openssl pkey -pubout -in private-key.pem -outform PEM)

Restituirà 'true' se e solo se la chiave privata corrisponde alla chiave pubblica nel certificato.

    
risposta data 02.11.2016 - 18:44
fonte

Leggi altre domande sui tag