Qu'est-ce qu'une empreinte de clé SSH et comment est-elle générée?

131

Je constate toujours que je reçois ce message lorsque je me sshconnecte à une nouvelle machine:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

Qu'est ce que cela signifie? Est-ce que chaque machine aura la même empreinte digitale à chaque fois?

Comment ces empreintes sont-elles générées? De quels paramètres dépendent-ils?

Kit Ho
la source

Réponses:

65

L’empreinte digitale est basée sur la clé publique de l’hôte, généralement basée sur "/etc/ssh/ssh_host_rsa_key.pub". C’est généralement pour faciliter l’identification / la vérification de l’hôte auquel vous vous connectez.

Si l'empreinte digitale change, la machine à laquelle vous vous connectez a changé de clé publique. Ce n'est peut-être pas une mauvaise chose (cela se produit lors de la réinstallation de ssh), mais cela peut également indiquer que vous vous connectez à une autre machine du même domaine / IP (se produit lorsque vous vous connectez via un équilibreur de charge) ou que vous vous connectez. sont ciblés par une attaque intercepteur, dans laquelle l'attaquant intercepte / redirige votre connexion ssh pour se connecter à un autre hôte qui pourrait surveiller votre utilisateur / pw.

En bout de ligne: si vous êtes averti d'une empreinte digitale modifiée, soyez prudent et vérifiez que vous vous connectez réellement au bon hôte via une connexion sécurisée. Bien que la plupart du temps, cela soit sans danger, cela peut indiquer un problème potentiel

Voir: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
et: http://en.wikipedia.org/ wiki / clé_fichier_public

madmaze
la source
5
"... soyez prudent et vérifiez bien que vous vous connectez au bon hôte via une connexion sécurisée" - question stupide, mais comment pouvez-vous le faire facilement?
Savara
1
@Savara Lorsque vous vous connectez à un serveur SSH auquel vous ne vous êtes pas connecté auparavant, vous devez demander la clé publique du serveur SSH à l'administrateur du serveur. L'administrateur du serveur vous donnera un morceau de texte. Vous devriez ajouter ce texte au fichier ~/.ssh/known_hosts. Ainsi, lorsque vous vous connecterez au serveur, votre client SSH reconnaîtra ce serveur, car vous avez enregistré sa clé publique dans known_hosts. Par conséquent, vous ne devriez jamais dire "oui" lorsque le client SSH vous indique que "l'authenticité de l'hôte ne peut pas être établie". Vous devez toujours ajouter la clé publique du serveur au préalable.
Utku
@Savara Si vous faites cela, vous saurez qu'il se passe quelque chose de louche lorsque votre client SSH vous indique "L'authenticité du client ne peut pas être établie" ou lorsqu'il vous indique "La clé publique du serveur a été modifiée". Par conséquent, vous devez toujours ajouter au ~/.ssh/known_hostspréalable la clé publique du serveur à votre fichier et ne jamais dire oui lorsque votre client SSH vous indique "L'authenticité du client ne peut pas être établie" ou lorsqu'elle vous indique "La clé publique du serveur a été modifié".
Utku
3
Oui, je suis parfaitement conscient du fonctionnement de la visualisation des empreintes digitales SSH, mais dans la plupart des cas, vous n'avez pas la possibilité d'obtenir l'empreinte digitale via un autre canal. TOFU est malheureusement le meilleur que nous obtenons souvent.
Savara
Existe-t-il un moyen de vérifier l'authenticité même après avoir répondu "oui"?
Échange
105

Vous pouvez générer une empreinte digitale pour une clé publique de la ssh-keygenmanière suivante:

ssh-keygen -lf /path/to/key.pub

Exemple concret (si vous utilisez une clé publique RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

La première partie (2048)est la longueur de la clé en bits, la deuxième partie (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)est l’empreinte digitale de la clé publique et la troisième partie est l’emplacement du fichier de clé publique elle-même.

Benjamin Oakes
la source
savez-vous traduire en 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 ce format à partir de cette clé publique?
Kit Ho
@KitHo Je ne suis pas sûr de comprendre votre question. J'ai mis à jour l'exemple, car je pense qu'il ssh-keygen -lffera ce que vous voulez.
Benjamin Oakes
5
Lorsque SSH-ing dans une nouvelle machine, ce que l’on voit n’est pas l’empreinte digitale de pubkey d’un utilisateur, mais l’empreinte digitale de pubkey de l’hôte. Donc, un meilleur exemple pour le contexte de la question est ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Il montre l'empreinte qui est également affichée sur les connexions SSH à localhost.
tanius
60
Mes empreintes digitales ssh-keygenrapportées sha256. Afin d'obtenir des md5empreintes digitales, j'ai couru ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Justin C
6
(@JustinC) Les versions OpenSSH 6.8 (mars 2015) et ultérieures ont été modifiées en SHA256, affichées en base64 plutôt qu'en hexadécimal, par défaut. Pour l'usage du client ssh -o FingerprintHash=md5ou l'équivalent dans ssh_configet sur les choses qui utilisent sshcomme scp.
dave_thompson_085
72

L’empreinte digitale est le MD5 recouvrant les données binaires de la clé publique codée en Base64.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Le md5sum 6530389635564f6464e8e3a47d593e19 est l’empreinte digitale affichée lors de la génération de la clé, mais sans les deux points de séparation.


Toutefois, si vous utilisez les empreintes digitales affichées par Amazon dans la console EC2 Key Pairs, il se peut que ce soit une bête différente . S'il s'agit d'une chaîne hexadécimale de 32 chiffres, il s'agit de l'empreinte digitale de clé publique MD5 SSH standard ci-dessus. Mais s'il s'agit de 40 chiffres hexadécimaux, il s'agit en fait d'une empreinte digitale calculée en prenant le SHA1 de la clé privée au format PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
la source
1
J'ai trouvé cette réponse utile dans le scénario suivant. Votre système utilise SHA1 pour calculer l'empreinte digitale, mais votre ami utilise md5. J'ai partagé une empreinte digitale qui était SHA1 et elle ne correspondait pas au MD5 généré par son système. Cela a aidé - merci! sed | s 'ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Cela est très important pour comprendre pourquoi cette empreinte digitale ne correspondra pas à celle des enregistrements DNS SSHFP, car ils utilisent des résumés SHA-1 ou SHA-256.
neirbowj
1
@Liczyrzepa le champ publickey peut avoir ou ne pas avoir '==' à la fin en fonction du type de clé et de la taille de bits; plus sûr et OMI plus facile à utiliser awk '{print $2}' /path/to/keyfile.pubou similaire.
dave_thompson_085
13
C’est la seule réponse qui explique le calcul de l’empreinte digitale
greuze
2
Cependant, dans Linux Mint, la commande est la suivante:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Si vous voulez vérifier un fichier de clé SSH pour voir s'il est identique à ce qui est rapporté comme "Clé de déploiement" par github, ceci est pour vous ...

Depuis l'URL privée: https://github.com/<username>/<repo_name>/settings/keys, vous verrez capture d'écran de github

Au terminal:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e [email protected] (RSA)

Vous remarquerez que vous obtenez la même empreinte digitale pour les clés privée et publique.

Cette même commande peut être combinée avec une fonctionnalité intéressante de GitHub, à savoir le fait qu'ils servent publiquement les clés publiques SSH des utilisateurs à l'adresse https://github.com/<username>.keys.

Voici un one-liner que vous pouvez utiliser pour en tirer parti.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Bruno Bronosky
la source
1
ssh-keygen -r host.name.com

Générera les empreintes de toutes les clés publiques configurées sur une instance sshd.

Ceux-ci peuvent ensuite être placés dans les enregistrements DNS SSHFP .

Mike Schroll
la source