Perché l'impronta digitale della mia chiave OpenSSH non corrisponde all'impronta digitale della keypair della console AWS EC2?


73

Quando imposto la mia chiave pubblica OpenSSH nel portachiavi di AWS EC2 l'impronta digitale che AWS mostra non corrisponde a ciò che vedo da:

ssh-keygen -l -f my_key

È una lunghezza diversa e ha byte diversi.

Perché? Sono sicuro di aver caricato la chiave corretta.

Risposte:


102

AWS EC2 mostra l'impronta digitale SSH2, non l'impronta digitale OpenSSH che tutti si aspettano. Non lo dice nell'interfaccia utente.

Mostra anche due tipi completamente diversi di impronte digitali a seconda che la chiave sia stata generata su AWS e scaricata o che tu abbia caricato la tua chiave pubblica.

Impronte digitali generate con

ssh-keygen -l -f id_rsa

sarà non corrispondono spettacoli EC2. Puoi utilizzare gli strumenti dell'API AWS per generare un'impronta digitale con il ec2-fingerprint-keycomando o utilizzare OpenSSL per farlo.

Nota che se hai originariamente generato una chiave su AWS, ma poi l'hai caricata di nuovo (diciamo, in un'altra regione), otterrai un'impronta digitale diversa perché prenderà l'impronta digitale SSA SSH2, anziché lo sha1 che mostra per le chiavi generato su AWS.

Divertimento, ehi? Questa schermata contiene due copie della stessa chiave con impronte digitali diverse

In quanto sopra, è test-generatedstato generato utilizzando AWS EC2. test-generated-reuploadedè la chiave pubblica della chiave privata generata da AWS, estratta ssh-keygen -ye caricata di nuovo. La terza chiave, test-uploadedè una chiave generata localmente ... ma l' ssh-keygen -limpronta digitale locale è b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea.

$ ssh-keygen -l -f theprivatekey
2048 b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
$ openssl pkey -in theprivatekey -pubout -outform DER | openssl md5 -c
Enter pass phrase for id_landp:
(stdin)= 91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2

Chiavi generate localmente

Puoi utilizzare OpenSSL, come dimostrato da Daniel nei forum AWS , per generare l'impronta digitale nel modulo utilizzato da AWS per mostrare le impronte digitali per le chiavi pubbliche caricate (SSH2 MD5), come:

7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0

Possono essere generati estraendo la parte pubblica dalla chiave privata e eseguendone l'hash usando:

openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c

Chiavi generate su AWS

Se l'impronta digitale della chiave visualizzata sulla console AWS è più lunga, era una chiave privata generata su AWS, come:

ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a

In questo caso è necessario utilizzare il seguente comando, mostrato anche da Daniel nei forum AWS, per generare un hash sha1 basato sulla chiave privata:

openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

sul file di chiave privata / certificato generato da AWS scaricato. Funzionerà anche su chiavi convertite in formato OpenSSH.

Riferimenti

Vedere:


4
Tristi della mancanza di chiarezza da parte di AWS al riguardo, stanno aprendo una potenziale violazione della sicurezza rendendo più difficile la verifica delle chiavi
Jaime Hablutzel,

Bella risposta! Sul primo sshdi comando, con le versioni più recenti, è necessario un opzione -E per specificare il formato md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel

14

Se hai solo chiavi pubbliche, puoi generare l'impronta digitale AWS come segue:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c

2

C'è una risorsa sui documenti AWS http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Se hai creato la tua coppia di chiavi utilizzando AWS, puoi utilizzare gli strumenti OpenSSL per generare un'impronta digitale dal file della chiave privata:

copia

$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c

Se hai creato la tua coppia di chiavi utilizzando uno strumento di terze parti e hai caricato la chiave pubblica su AWS, puoi utilizzare gli strumenti OpenSSL per generare un'impronta digitale dal file della chiave privata sul tuo computer locale:

copia

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c

L'output deve corrispondere all'impronta digitale visualizzata nella console.


2

Questo è quello che uso:

openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print $2}'

Questo genera l'impronta digitale dalla chiave pubblica, simile ad alcuni dei precedenti.


1

Per quelli di noi che usano Python

from Crypto.PublicKey import RSA
import hashlib
import base64

#Load your key from disk, or a string, or generate.
my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())

# Normal md5 fingerprint
fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

#AWS' EC2 fingerprint
public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

Sfortunatamente questo non è riuscito per me su macOS 10.11 usando l'ultimo Homebrew Python 2.7.13, con questo errore:ValueError: PEM encryption format not supported.
RichVel

@RichVel, non riesco a riprodurre l'errore. Ho appena testato su macOS 10.12 usando homebrew python 2.7.13 in virtualenv, e ha funzionato perfettamente. Se dovessi indovinare, forse alcuni dei requisiti C per pycrypto non sono stati soddisfatti per te. Forse questo potrebbe aiutare?
Andy,

1
#!/bin/bash
key_file=$1
if [[ -n $key_pub_file ]]; then
    ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
else
    echo "pass the pub file as argument"
fi

Ecco uno script che uso, aggiungo il percorso dello script a env. Grazie a J.Doe per la risposta



0

Java (usando BouncyCastle). Se la console AWS visualizza tasti più corti, prova con MD5. (SHA1: 20 byte, MD5: 16 byte).

  /**
   * @return the SHA1 digest of the DER encoded RSA private key, e.g. 16:61:7d:1c:e7:d1:3b:93:b6:81:bf:64:7a:a0:38:fa:b6:6c:9e:e4
   */
  private String getAwsFingerprint(File rsaPrivateKeyFileFromAws) throws Exception {
    try(FileReader reader = new FileReader(rsaPrivateKeyFileFromAws)) {
      java.security.KeyPair keyPair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) new PEMParser(reader).readObject());
      String hex = Hex.toHexString(MessageDigest.getInstance("SHA1").digest(keyPair.getPrivate().getEncoded()));
      StringBuilder sb = new StringBuilder();
      for(int i = 0; i < hex.length();) {
        sb.append(hex.charAt(i++));
        sb.append(hex.charAt(i++));
        sb.append(i % 2 == 0 && i != hex.length() ? ":" : "");
      }
      return sb.toString();
    }
  }
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.