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

73

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

ssh-keygen -l -f my_key

C'est une longueur différente et a différents octets.

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

Craig Ringer
la source

Réponses:

102

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

Il indique également deux types d'empreintes digitales complètement différentes 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 pas correspondre à ce que montre EC2. Vous pouvez utiliser les outils de l'API AWS pour générer une empreinte digitale avec la ec2-fingerprint-keycommande ou utiliser OpenSSL pour le faire.

Notez que si vous avez initialement généré une clé sur AWS, puis que vous l'avez à nouveau chargée (dans une autre région, par exemple), vous obtiendrez une empreinte différente, car elle utilisera l'empreinte SSH2 RSA, plutôt que le sha1 affiché pour les clés que vous utilisez. généré sur AWS.

Fun, hey? Cette copie d'écran contient deux copies de la même clé avec différentes empreintes digitales

Dans ce qui précède, a test-generatedété généré à l'aide de AWS EC2. test-generated-reuploadedest la clé publique de la clé privée AWS générée, extraite avec ssh-keygen -yet téléchargée à nouveau. La troisième clé, test-uploadedest une clé générée localement ... mais l' ssh-keygen -lempreinte locale 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 l'a démontré Daniel sur les forums AWS , pour générer l'empreinte sous la forme utilisée par AWS pour afficher les empreintes des clés publiques téléchargées (SSH2 MD5), par exemple:

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 à l'aide de:

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

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

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

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 certificat / clé privée généré par AWS téléchargé. Cela fonctionnera également sur les clés converties au format OpenSSH.

Références

Voir:

Craig Ringer
la source
4
Malheureusement,
Très bonne réponse! Sur la première sshcommande, avec des versions plus récentes , vous avez besoin d' une option -E pour spécifier le format md5: ssh-keygen -E md5 -l -f id_rsa.
RichVel
14

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
J. Doe
la source
2

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 ordinateur local:

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.

goutham
la source
2

C'est 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 de la clé publique, semblable à certaines des précédentes.

Max Murphy
la source
1

Pour ceux 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]))
Andy
la source
Malheureusement, cela a échoué pour moi sur macOS 10.11 avec la dernière version de Homebrew Python 2.7.13, avec l'erreur suivante:ValueError: PEM encryption format not supported.
RichVel
@RichVel, je ne peux pas reproduire l'erreur. Je viens de tester est sur macOS 10.12 en utilisant homebrew python 2.7.13 dans un virtualenv, et cela a fonctionné très bien. Si je devais deviner, peut-être que certaines des exigences de C relatives à pycrypto n’étaient pas remplies. Peut - être que cela pourrait aider?
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

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

Sand1512
la source
0

Java (en utilisant BouncyCastle). Si la console AWS affiche des clés 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();
    }
  }
Reto Höhener
la source