Empreinte digitale de la clé ssh PEM

30

J'ai un fichier PEM que j'ajoute à un agent ssh en cours d'exécution:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Comment puis-je obtenir l'empreinte digitale de la clé (que je vois dans ssh-agent) directement à partir du fichier? Je sais que cela ssh-keygen -l -f some_keyfonctionne pour les clés ssh "normales", mais pas pour les fichiers PEM.

Si j'essaie ssh-keygen sur le fichier .pem, j'obtiens:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Cette clé commence par:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

par opposition à une clé privée "régulière", qui ressemble à:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
Inconnu
la source
Pourquoi pensez-vous que cela ne fonctionne pas pour les fichiers PEM? Quelle erreur obtenez-vous lorsque vous l'essayez? Un .ssh/id_rsafichier généré par OpenSSH en utilisant toutes les valeurs par défaut EST un fichier PEM. Les clés privées sont encodées PEM par défaut. En fait, vous pouvez utiliser les clés RSA que vous générez avec OpenSSL directement avec OpenSSH.
Zoredache
description mise à jour avec sortie de ssh-keygen sur le .pem
Inconnu
(tard mais nécroisé) @Zoredache: Avant 7.2 (en 2016, après ce Q), ssh-keygen -lil était impossible de lire un fichier de clé privée, bien que d'autres ssh-keygen(et ssh*) opérations le fassent. Mais lorsqu'il ssh-keygen génère une clé, il écrit à la fois le fichier de clé privée par exemple id_rsa et un fichier publickey correspondant avec .pubpar exemple ajouté id_rsa.pub. Older ssh-keygen -l va essayer d' ajouter .pubau nom du fichier que vous spécifiez et la lecture de ce fichier publickey.
dave_thompson_085

Réponses:

34

Si vous souhaitez récupérer l'empreinte de votre fichier de clé publique perdu, vous pouvez le récupérer à partir du fichier de clé privée :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Ensuite, vous pouvez vérifier l'empreinte digitale publique:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

Sur certains systèmes plus récents, cela imprime l'empreinte SHA256 de la clé. Vous pouvez imprimer l'empreinte digitale MD5 de la clé (le signe deux-points) en utilisant l'option -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Ou en une seule ligne de commande :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
la source
@ La réponse de MikeD est en fait la "bonne" réponse à ce que le PO recherchait (et ce que je cherchais). AWS fournit l'empreinte digitale dans le format qu'il a montré, avec les paires de chiffres séparés par des deux-points. Sa solution (extraite de la page AWS fournie) génère également l'empreinte digitale de la même manière, afin que vous puissiez vérifier correctement.
Mike Williamson
50

AWS " Vérification de l'empreinte digitale de votre paire de clés " propose deux lignes simples qui résolvent le problème, selon la façon dont votre clé a été créée.

Si vous avez créé votre paire de clés à l'aide d'AWS:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Ou, si vous avez créé votre paire de clés avec un outil tiers:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(empreintes digitales caviardées dans la sortie ci-dessus)

Mike D
la source
6

Voici une ligne qui devrait faire ce que vous voulez sans nécessiter la création d'un fichier de clé publique localement.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Ceci utilise la chaîne bash here <<<afin d'avoir stdin disponible sous forme de fichier normal ( /dev/stdin) plutôt que de canal car ssh-keygenil ne fonctionnera que sur un fichier.

À partir de la version 7.2 d'OpenShsh ssh-keygen prend en charge l'empreinte digitale à partir de l'entrée standard:

  • ssh-keygen (1): autorise les empreintes digitales à partir de l'entrée standard, par exemple "ssh-keygen -lf -"

Notez que cette commande rompra avec les clés privées qui utilisent une phrase secrète et n'utilisent pas d'agent. Il devrait fonctionner avec des fichiers pem générés par AWS ou OpenStack qui n'utilisent pas de mots de passe.

Voir https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin pour plus d'informations.

htaccess
la source
Les notes de version ne le disaient pas, mais selon la source, la version 7.2 -lprend également en charge la lecture d'un fichier de clé privée (mais pas à partir de stdin).
dave_thompson_085
2

Vous n'obtenez pas l'empreinte digitale du fichier de clé privée mais du fichier de clé publique.

En fait, ssh-keygen vous l'a déjà dit:

./query.pem n'est pas un fichier de clé publique.

Exécutez-le contre la moitié publique de la clé et cela devrait fonctionner.

Plus généralement

Pensez-y: la raison de l'existence de l'empreinte digitale est que vous pouvez identifier la clé publique. En fait, obtenir un hachage de la clé privée est un problème de sécurité potentiel en plus d'être inutile pour le serveur (qui n'a même pas la clé privée en question).

Une fois que vous avez la clé publique, le processus consiste à vérifier que le client a une retenue sur la moitié privée correspondante. Comme vous savez déjà quelles clés vous essayez de vérifier, vous n'avez pas besoin de l'empreinte digitale.

Stéphane
la source
Le problème est que je n'ai pas de clé publique pour cette clé privée :( Et une autre chose, ssh-keygenfonctionne sur un fichier de clé privée RSA qui contient les informations supplémentaires au début (voir mon post initial), mais pas sur celui-ci. .
Unknown
Ensuite, vous ne pouvez rien y faire. Vous ne pouvez pas obtenir la moitié publique de la clé de la partie privée pas plus que vous ne pouvez faire l'inverse.
Stéphane
3
C'est faux. Comme l'a souligné @ominug ci-dessus, ssh-keygen -yffait cela.
Steve Bennett
4
@Stephane Bien que correct au niveau RSA pur, en pratique, la façon dont les clés sont stockées dans la spécification PKCS, le format des clés privées inclut en fait les deux clés. Comparer les spécifications pour privé et public
Håkan Lindqvist
"Vous ne pouvez pas obtenir la moitié publique de la clé de la partie privée ..." - oh oui, vous le pouvez probablement. Prenez le module de la clé privée et utilisez 65537 comme exposant public, et vous avez probablement trouvé la clé publique.
Jim Flood