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é.
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?
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
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
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.
Voir:
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
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.
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.
#!/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
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.
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]))
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();
}
}