Impronta digitale del tasto ssh PEM


30

Ho un file PEM che aggiungo a un ssh-agent in esecuzione:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Come posso ottenere l'impronta digitale della chiave (che vedo in ssh-agent) direttamente dal file? So che ssh-keygen -l -f some_keyfunziona con chiavi ssh "normali", ma non con file PEM.

Se provo ssh-keygen sul file .pem, ottengo:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Questa chiave inizia con:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

al contrario di una chiave privata "normale", che assomiglia a:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.

Perché pensi che non funzioni con i file PEM? Che errore ricevi quando lo provi? Un .ssh/id_rsafile generato da OpenSSH che utilizza tutte le impostazioni predefinite È un file PEM. Le chiavi private sono codificate PEM per impostazione predefinita. In effetti è possibile utilizzare le chiavi RSA generate con OpenSSL direttamente con OpenSSH.
Zoredache,

descrizione aggiornata con output di ssh-keygen su .pem
Sconosciuto il

(in ritardo ma necroed) @Zoredache: prima della 7.2 (nel 2016, dopo questa Q) ssh-keygen -lnon era possibile leggere un file di chiave privata, sebbene lo facciano altre ssh-keygen(e ssh*) operazioni. Ma quando ssh-keygen genera una chiave scrive sia il file privatekey eg id_rsa e un corrispondente file publickey con .pubaggiunto eg id_rsa.pub. Più vecchio ssh-keygen -l sarà provare ad aggiungere .pubal nome del file specificato e la lettura di quel file chiave pubblica.
dave_thompson_085,

Risposte:


34

Se si desidera recuperare l'impronta digitale del file della chiave pubblica persa, è possibile recuperarlo dal file della chiave privata :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Quindi sei in grado di accertare l'impronta digitale pubblica:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

Su alcuni sistemi più recenti, questo stampa l'impronta digitale SHA256 della chiave. È possibile stampare l'impronta digitale MD5 della chiave (il modulo due punti) utilizzando l'opzione -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

O come una riga di comando :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

@ La risposta di MikeD è in realtà la risposta "corretta" per ciò che l'OP stava cercando (e quello che stavo cercando). AWS fornisce l'impronta digitale nel formato mostrato, con le coppie di cifre separate da due punti. La sua soluzione (tratta dalla pagina AWS fornita) genera anche l'impronta digitale nello stesso modo, in modo che tu possa verificarlo correttamente.
Mike Williamson,

50

" Verifica dell'impronta digitale della tua coppia di chiavi " di AWS fornisce due linee di risposta che risolvono il problema, a seconda di come è stata creata la chiave.

Se hai creato la tua coppia di chiavi usando AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Oppure, se hai creato la tua coppia di chiavi con uno strumento di terze parti:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(impronte digitali ridotte nell'output sopra)


6

Ecco una linea che dovrebbe fare quello che vuoi senza richiedere la creazione di un file di chiave pubblica localmente.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Questo utilizza la stringa bash here <<<per avere stdin disponibile come file normale ( /dev/stdin) anziché come pipe, poiché ssh-keygenfunzionerà solo su un file.

A partire dalla versione 7.2 di openssh ssh-keygen supporta l'impronta digitale dall'input standard:

  • ssh-keygen (1): consente l'impronta digitale dall'input standard, ad esempio "ssh-keygen -lf -"

Si noti che questo comando si interromperà con le chiavi private che utilizzano una passphrase e non utilizzano un agente. Dovrebbe funzionare con file pem generati da AWS o OpenStack che non usano passphrase.

Vedi https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin per maggiori informazioni.


Le note di rilascio non lo dicevano, ma secondo la fonte al 7.2 -lsupporta anche la lettura di un file privatekey (ma non da stdin).
dave_thompson_085,

2

Non si ottiene l'impronta digitale dal file della chiave privata ma dal file della chiave pubblica.

In effetti, ssh-keygen ti ha già detto questo:

./query.pem non è un file di chiave pubblica.

Eseguilo contro la metà pubblica della chiave e dovrebbe funzionare.

Più in generale

Pensaci: il motivo dell'esistenza dell'impronta digitale è che puoi identificare la chiave pubblica. In effetti, ottenere un hash della chiave privata è un potenziale problema di sicurezza oltre ad essere inutile per il server (che non ha nemmeno la chiave privata in questione).

Una volta che hai la chiave pubblica, il processo è verificare che il client abbia una sospensione sulla metà privata corrispondente. Dato che sai già quali chiavi stai cercando di verificare, non hai bisogno dell'impronta digitale.


Il problema è che non ho una chiave pubblica per questa privata :( E un'altra cosa, ssh-keygenfunziona su un file di chiave privata RSA che ha le informazioni extra all'inizio (vedi il mio post iniziale), ma non su questa. .
Unknown

Quindi non c'è niente che tu possa fare al riguardo. Non puoi ottenere la metà pubblica della chiave dalla parte privata come non puoi fare il contrario.
Stephane,

3
Non è corretto Come sottolineato da @ominug sopra, ssh-keygen -yffa questo.
Steve Bennett,

4
@Stephane Sebbene corretto a livello di RSA puro, in pratica il modo in cui le chiavi sono archiviate nelle specifiche PKCS il formato per le chiavi private include effettivamente entrambe le chiavi. Confronta le specifiche per privato vs pubblico
Håkan Lindqvist,

"Non puoi ottenere la metà pubblica della chiave dalla parte privata ..." - oh sì, probabilmente puoi. Prendi il modulo dalla chiave privata e usa 65537 come esponente pubblico e, probabilmente, hai trovato la chiave pubblica.
Jim Flood
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.