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


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

ssh-keygen -l -f my_key

Es hat eine andere Länge und verschiedene Bytes.

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


63
2018-06-10 04:28


Ursprung




Antworten:


AWS EC2 zeigt den SSH2-Fingerabdruck, nicht den OpenSSH-Fingerabdruck, den alle erwarten. Es sagt dies nicht in der Benutzeroberfläche.

Es zeigt auch zwei völlig verschiedene Arten von Fingerabdrücken Dies hängt davon ab, ob der Schlüssel in AWS generiert und heruntergeladen wurde oder ob Sie einen eigenen öffentlichen Schlüssel hochgeladen haben.

Fingerabdrücke generiert mit

ssh-keygen -l -f id_rsa

werden nicht match was EC2 zeigt. Sie können entweder die AWS API-Tools verwenden, um einen Fingerabdruck mit dem zu generieren ec2-fingerprint-key Befehl, oder verwenden Sie OpenSSL, um es zu tun.

Beachten Sie, dass Sie, wenn Sie ursprünglich einen Schlüssel in AWS generiert haben, ihn dann aber erneut hochgeladen haben (z. B. in eine andere Region), dann erhalten Sie eine unterschiedlicher Fingerabdruck weil es den SSH2-RSA-Fingerabdruck und nicht den sha1 für Schlüssel, die Sie in AWS erstellt haben, benötigt.

Spaß, hey? This screenshot has two copies of the same key in it with different fingerprints

In obigem, test-generated wurde mit AWS EC2 generiert. test-generated-reuploaded wird der öffentliche Schlüssel aus dem privaten Schlüssel AWS generiert, mit extrahiert ssh-keygen -y und erneut hochgeladen. Der dritte Schlüssel, test-uploaded, ist ein lokal generierter Schlüssel ... aber der lokale ssh-keygen -l Fingerabdruck ist 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

Schlüssel lokal generiert

Sie können OpenSSL als verwenden demonstriert von Daniel in den AWS Foren, um den Fingerabdruck in der von AWS verwendeten Form zu generieren, um Fingerabdrücke für hochgeladene öffentliche Schlüssel (SSH2 MD5) anzuzeigen, wie:

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

Sie können generiert werden, indem Sie den öffentlichen Teil aus dem privaten Schlüssel extrahieren und ihn mit folgenden Hash-Werten verarbeiten:

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

In AWS generierte Schlüssel

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

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 mit dem folgenden Befehl, der auch von Daniel in den AWS-Foren angezeigt wird, einen sha1-Hash basierend auf dem privaten Schlüssel generieren:

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

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

Verweise

Sehen:


92
2018-06-10 04:28



Traurig die fehlende Klarheit von AWS darüber, sie öffnen eine potentielle Sicherheitslücke, die es erschwert, Schlüssel zu verifizieren - Jaime Hablutzel
Gute Antwort! Am Anfang ssh Befehl, mit neueren Versionen benötigen Sie eine -E-Option, um MD5-Format anzugeben: ssh-keygen -E md5 -l -f id_rsa. - RichVel


Wenn Sie nur öffentliche Schlüssel haben, können Sie den AWS-Fingerabdruck folgendermaßen generieren:

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

9
2018-02-17 13:28





Es gibt eine Ressource in AWS-Dokumenten http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Wenn Sie Ihr Schlüsselpaar mithilfe von AWS erstellt haben, können Sie mithilfe der OpenSSL-Tools einen Fingerabdruck aus der Datei mit dem privaten Schlüssel 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 in AWS hochgeladen haben, können Sie mithilfe der OpenSSL-Tools einen Fingerabdruck aus der Datei mit dem privaten Schlüssel 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.


2
2018-06-20 08:27





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]))

1
2018-02-08 22:37



Leider scheiterte das bei mir auf macOS 10.11 mit dem neuesten Homebrew Python 2.7.13, mit folgendem Fehler: ValueError: PEM encryption format not supported. - RichVel
@RichVel, ich kann den Fehler nicht nachvollziehen. Ich habe gerade getestet, ist auf MacOS 10.12 mit Homebrew Python 2.7.13 in einem virtualenv, und es hat gut funktioniert. Wenn ich raten müsste, wären vielleicht einige C-Anforderungen für pycrypto nicht erfüllt worden. Könnte sein diese könnte helfen? - Andy


Das ist was ich benutze:

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

Dies erzeugt den Fingerabdruck vom öffentlichen Schlüssel, ähnlich wie bei einigen der obigen.


1
2017-09-10 13:29





#!/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üge den Skriptpfad zu env hinzu. Danke an J.Doe für die Antwort


1
2018-06-25 06:59





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

Druckt den Fingerabdruck für den Benutzer-Bob, der dem von AWS verwendeten Format entspricht.


0
2017-10-10 15:05