Warum stimmt mein OpenSSH-Schlüsselfingerabdruck nicht mit dem AWS EC2-Konsolenschlüsselpaar-Fingerabdruck überein?

73

Wenn ich meinen öffentlichen OpenSSH-Schlüssel in den Schlüsselbund von AWS EC2 importiere, stimmt der von AWS angezeigte Fingerabdruck nicht mit dem überein, was ich sehe:

ssh-keygen -l -f my_key

Es ist unterschiedlich lang und hat unterschiedliche Bytes.

Warum? Ich bin sicher, dass ich den richtigen Schlüssel hochgeladen habe.

Craig Ringer
quelle

Antworten:

102

AWS EC2 zeigt den SSH2-Fingerabdruck, nicht den OpenSSH-Fingerabdruck, den alle erwarten. Dies wird in der Benutzeroberfläche nicht angegeben.

Es werden auch zwei völlig unterschiedliche Arten von Fingerabdrücken angezeigt, je nachdem, ob der Schlüssel in AWS generiert und heruntergeladen wurde oder ob Sie Ihren eigenen öffentlichen Schlüssel hochgeladen haben.

Fingerabdrücke generiert mit

ssh-keygen -l -f id_rsa

wird nicht mit dem übereinstimmen, was EC2 zeigt. Sie können entweder die AWS-API-Tools verwenden, um mit dem ec2-fingerprint-keyBefehl einen Fingerabdruck zu generieren , oder OpenSSL verwenden, um dies zu tun.

Beachten Sie, dass Sie einen anderen Fingerabdruck erhalten , wenn Sie ursprünglich einen Schlüssel in AWS generiert und ihn dann erneut hochgeladen haben (z. B. in eine andere Region), da der SSH2-RSA-Fingerabdruck und nicht der von Ihnen angezeigte sha1-Wert für Schlüssel verwendet wird auf AWS generiert.

Spaß, hey? Dieser Screenshot enthält zwei Kopien desselben Schlüssels mit unterschiedlichen Fingerabdrücken

Oben test-generatedwurde mit AWS EC2 generiert. test-generated-reuploadedist der öffentliche Schlüssel aus dem privaten Schlüssel, den AWS generiert, extrahiert ssh-keygen -yund erneut hochgeladen hat. Der dritte Schlüssel test-uploadedist ein lokal generierter Schlüssel, der lokale ssh-keygen -lFingerabdruck jedoch 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

Lokal erzeugte Schlüssel

Wie Daniel in den AWS-Foren demonstriert hat, können Sie OpenSSL verwenden, um den Fingerabdruck in der Form zu generieren, die von AWS zum Anzeigen von Fingerabdrücken für hochgeladene öffentliche Schlüssel (SSH2 MD5) verwendet wird.

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

Sie können generiert werden, indem der öffentliche Teil aus dem privaten Schlüssel extrahiert und mit folgendem Hashing verarbeitet wird:

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

In AWS generierte Schlüssel

Wenn der in der AWS-Konsole angezeigte Schlüsselfingerabdruck länger ist, handelt es sich um einen privaten Schlüssel, der in AWS generiert wurde. Beispiel:

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

In diesem Fall müssen Sie den folgenden Befehl verwenden, der auch von Daniel in den AWS-Foren angezeigt wird, um einen sha1-Hash auf der Grundlage des privaten Schlüssels zu generieren:

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

in der heruntergeladenen AWS-generierten privaten Schlüssel- / Zertifikatdatei. Es funktioniert auch mit Schlüsseln, die Sie in das OpenSSH-Format konvertiert haben.

Verweise

Sehen:

Craig Ringer
quelle
4
Traurig, die fehlende Klarheit von AWS darüber, sie öffnen eine potenzielle Sicherheitslücke, die es schwieriger macht, Schlüssel zu überprüfen
Jaime Hablutzel
Gute Antwort! Auf dem anfänglichen sshBefehl, mit neueren Versionen benötigen Sie eine Option -E md5 Format angeben: ssh-keygen -E md5 -l -f id_rsa.
RichVel
14

Wenn Sie nur öffentliche Schlüssel haben, können Sie den AWS-Fingerabdruck wie folgt generieren:

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

In den AWS-Dokumenten befindet sich eine Ressource: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Wenn Sie Ihr Schlüsselpaar mit AWS erstellt haben, können Sie mit den OpenSSL-Tools einen Fingerabdruck aus der privaten Schlüsseldatei generieren:

Kopieren

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

Wenn Sie Ihr Schlüsselpaar mit einem Drittanbieter-Tool erstellt und den öffentlichen Schlüssel auf AWS hochgeladen haben, können Sie mit den OpenSSL-Tools einen Fingerabdruck aus der privaten Schlüsseldatei auf Ihrem lokalen Computer generieren:

Kopieren

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

Die Ausgabe sollte mit dem Fingerabdruck übereinstimmen, der in der Konsole angezeigt wird.

goutham
quelle
2

Das benutze ich:

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}'

Dadurch wird der Fingerabdruck aus dem öffentlichen Schlüssel generiert, ähnlich wie bei einigen der oben genannten.

Max Murphy
quelle
1

Für diejenigen von uns, die Python verwenden

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]))
Andy
quelle
Leider scheiterte das für mich auf macOS 10.11 neuesten Homebrew Python 2.7.13, mit diesem Fehler mit:ValueError: PEM encryption format not supported.
RichVel
@ RichVel, ich kann den Fehler nicht reproduzieren. Ich habe gerade getestet, dass es unter MacOS 10.12 mit Homebrew Python 2.7.13 in einer virtuellen Umgebung läuft und es hat einwandfrei funktioniert. Wenn ich raten müsste, wurden möglicherweise einige der C-Anforderungen für Pycrypto für Sie nicht erfüllt. Vielleicht dies helfen könnte?
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

Hier ist ein Skript, das ich verwende. Fügen Sie den Skriptpfad zu env hinzu. Vielen Dank an J.Doe für die Antwort

Sand1512
quelle
0

Nur für den Fall, dass dies nützlich sein könnte: https://ssh-vault.com/post/fingerprint/

zum Beispiel:

$ ssh-vault -u bob -f

Gibt den Fingerabdruck für den Benutzer aus, der dem von AWS verwendeten Format entspricht.

nbari
quelle
0

Java (mit BouncyCastle). Wenn die AWS-Konsole kürzere Schlüssel anzeigt, versuchen Sie es mit MD5. (SHA1: 20 Bytes, MD5: 16 Bytes).

  /**
   * @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();
    }
  }
Reto Höhener
quelle