web-dev-qa-db-fra.com

Pourquoi mon empreinte digitale de clé OpenSSH ne correspond-elle pas à l'empreinte digitale de paire de clés de la console AWS EC2?

Lorsque j'importe ma clé publique OpenSSH dans le trousseau de clés d'AWS EC2, l'empreinte digitale affichée par AWS ne correspond pas à ce que je vois:

ssh-keygen -l -f my_key

Il s'agit d'une longueur différente et de différents octets.

Pourquoi? Je suis sûr d'avoir téléchargé la bonne clé.

82
Craig Ringer

AWS EC2 affiche l'empreinte SSH2, pas l'empreinte OpenSSH que tout le monde attend. Cela ne dit pas cela dans l'interface utilisateur.

Il montre également deux types d'empreintes digitales complètement différents selon que la clé a été générée sur AWS et téléchargée, ou si vous avez téléchargé votre propre clé publique.

Empreintes digitales générées avec

ssh-keygen -l -f id_rsa

ne correspondra pas à ce que montre EC2. Vous pouvez soit utiliser les outils AWS API pour générer une empreinte digitale avec le ec2-fingerprint-key ou utilisez OpenSSL pour le faire.

Notez que si vous avez initialement généré une clé sur AWS, mais que vous l'avez ensuite téléchargée à nouveau (par exemple, dans une autre région), vous obtiendrez une empreinte digitale différente car cela prendra l'empreinte SSH2 RSA, plutôt que le sha1 qu'il montre pour les clés que vous avez générées sur AWS.

Amusant, hein? This screenshot has two copies of the same key in it with different fingerprints

Au dessus, test-generated a été généré à l'aide d'AWS EC2. test-generated-reuploaded est la clé publique de la clé privée générée par AWS, extraite avec ssh-keygen -y et téléchargé à nouveau. La troisième clé, test-uploaded, est une clé générée localement ... mais la clé locale ssh-keygen -l l'empreinte digitale est 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

Clés générées localement

Vous pouvez utiliser OpenSSL, comme démontré par Daniel sur les forums AWS , pour générer l'empreinte digitale sous la forme utilisée par AWS pour afficher les empreintes digitales des clés publiques téléchargées (SSH2 MD5), comme:

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

Ils peuvent être générés en extrayant la partie publique de la clé privée et en la hachant en utilisant:

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

Clés générées sur AWS

Si l'empreinte digitale de la clé affichée sur la console AWS est plus longue, il s'agissait d'une clé privée générée sur AWS, comme:

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

Dans ce cas, vous devez utiliser la commande suivante, également affichée par Daniel sur les forums AWS, pour générer un hachage sha1 basé sur la clé privée:

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

sur le fichier de clé privée/certificat généré par AWS téléchargé. Cela fonctionnera également sur les clés que vous avez converties au format OpenSSH.

Références

Voir:

112
Craig Ringer

Si vous ne disposez que de clés publiques, vous pouvez générer l'empreinte AWS comme suit:

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

Il existe une ressource sur les documents AWS http://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

Si vous avez créé votre paire de clés à l'aide d'AWS, vous pouvez utiliser les outils OpenSSL pour générer une empreinte digitale à partir du fichier de clé privée:

Copie

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

Si vous avez créé votre paire de clés à l'aide d'un outil tiers et téléchargé la clé publique sur AWS, vous pouvez utiliser les outils OpenSSL pour générer une empreinte digitale à partir du fichier de clé privée sur votre machine locale:

Copie

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

La sortie doit correspondre à l'empreinte digitale affichée dans la console.

2
goutham

Voici ce que j'utilise:

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

Cela génère l'empreinte digitale à partir de la clé publique, similaire à certains des éléments ci-dessus.

2
Max Murphy
#!/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

Voici un script que j'utilise, ajoutez le chemin du script à env. Merci à J.Doe pour la réponse

1
Sand1512

Juste au cas où cela pourrait être utile: https://ssh-vault.com/post/fingerprint/

par exemple:

$ ssh-vault -u bob -f

Imprime l'empreinte digitale de l'utilisateur bob correspondant au format utilisé par AWS.

1
nbari

Pour ceux d'entre nous qui utilisent 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]))
1
Andy

Java (en utilisant BouncyCastle). Si la console AWS affiche des touches plus courtes, essayez avec MD5. (SHA1: 20 octets, MD5: 16 octets).

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