Commandes utilisées
-
Afficher l'ascii-art de la clé publique de l'hôte stockée sur le serveur (à faire côté serveur, celui auquel vous vous connectez via ssh) :
ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key.pub
-l :Afficher l'empreinte du fichier de clé publique spécifié.
-v :visuel (ascii-art)
-f :fichier
-
Afficher l'ascii-art de la clé d'hôte publique du serveur distant (à faire côté client, celui à partir duquel vous vous connectez via ssh) :
ssh -o visualhostkey=yes -o FingerprintHash=md5 <host_server_to_connect>
-o :choix
visualhostkey :visuel (ascii-art)
Hachage d'empreintes digitales :algo de hachage à utiliser
Que faire pour vérifier l'authenticité d'un hôte/serveur
La première, 1. est à faire localement sur le serveur (celui auquel vous souhaitez vous connecter via ssh ) :cela vous donnera un premier ascii-art. Imprimez-le ou prenez une photo.
Deuxièmement, 2. doit être fait lors de la première connexion SSH; il affichera un deuxième ascii-art. Si l'ascii-art est le même, alors vous pouvez répondre oui au "est-ce que j'ai confiance ?" question (c'est-à-dire Are you sure you want to continue connecting (yes/no)
).
Exemple
- Côté serveur
$ ssh-keygen -l -v -f /etc/ssh/ssh_host_ecdsa_key.pub
256 2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6 (ECDSA)
+--[ECDSA 256]---+
| . |
|o o |
| o + . |
| o o . |
| . + S . . |
| + . . . o |
| . .o ..o o |
| ooo....+ |
| o= . E.. |
+-----------------+
- Côté client
$ ssh -o visualhostkey=yes -o FingerprintHash=md5 192.168.12.211
The authenticity of host '192.168.12.211 (192.168.12.211)' can't be established.
ECDSA key fingerprint is MD5:2e:a6:b3:27:14:12:0b:79:df:9a:7f:bd:4d:b1:e0:b6.
+---[ECDSA 256]---+
| . |
|o o |
| o + . |
| o o . |
| . + S . . |
| + . . . o |
| . .o ..o o |
| ooo....+ |
| o= . E.. |
+------[MD5]------+
Are you sure you want to continue connecting (yes/no)?
Plus d'explications
La première commande affichera l'ascii-art correspondant à l'empreinte digitale du fichier que vous donnez en entrée. Le fichier que vous donnez en entrée est l'hôte public clé du serveur. Lorsqu'un client se connecte (pas seulement pour la première fois), le serveur enverra sa clé d'hôte publique. Cette clé d'hôte publique sera recherchée dans ~/.ssh/known_hosts
. Si la clé publique est dans le fichier, alors ça va :l'hôte (serveur) est connu, nous passons donc à l'étape suivante pour authentifier l'utilisateur (l'authentification de l'utilisateur n'est pas décrite dans ce post). Si la clé publique n'est pas dans le fichier, alors le client calculera l'empreinte de cette clé publique d'hôte avec un algorithme de hachage (un algo de hachage différent donnera une empreinte différente). Cette empreinte précédemment calculée s'affiche (accompagnée de l'ascii-art si l'option correspondante est fournie) et vous devrez répondre oui ou non selon que vous reconnaissez cette empreinte ou non (cette empreinte est l'image/hash de la clé publique de l'hôte serveur). Si vous répondez oui, alors la clé publique du serveur (pas son empreinte digitale) sera ajoutée au fichier ~/.ssh/known_hosts
.
On peut remarquer que ~/.ssh/known_hosts
est sous votre répertoire personnel (~), parce que vous faire confiance à cet hôte (serveur), mais un autre utilisateur peut ne pas faire confiance au même que vous. De plus, la clé publique hôte du serveur ne dépend pas de l'utilisateur, elle est donc stockée dans /etc/ssh/
.
La deuxième commande affichera l'empreinte digitale et l'ascii-art de la clé publique reçue du host_server_to_connect (selon l'algorithme de hachage donné dans les options). C'est la même chose que de faire uniquement ssh, mais avec plus d'options visuelles, donc la connexion continuera de la même manière qu'une connexion ssh normale.
Sur mon système, je dois spécifier une clé MD5 au lieu du SHA256 par défaut :
ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ecdsa_key.pub
Cela génère une chaîne dans un format qui correspond à l'erreur que j'ai vue sur le client.
Attends, j'ai trouvé. Exécutez la commande :
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
Avec un ssh récent (OpenSSH_6.0p1, OpenSSL 1.0.0j 10 mai 2012), je l'ai scripté comme ceci :
ssh-keyscan -t ecdsa localhost 2>&1 | grep ecdsa
localhost ecdsa-sha2-nistp256 AAAAE2VlongKey...=
Remarques :
- si votre sshd s'exécute sur un port personnalisé, ajoutez '
-p portNumber
' aussh-keyscan
commande) ssh-keyscan
écrit surstderr
, passtdout
(!), d'où lebash
redirection '2>&1
' (qui peut varier selon votre shell)
C'est la ligne que j'ai ajoutée à mon ~/.ssh/known_hosts
file afin d'autoriser les requêtes ssh de localhost pour mes tests (principalement pour gitolite, qui utilise ssh).
Daniel Böhmer confirme dans les commentaires :
ssh-keyscan
fournit la ou les clés publiques complètes du serveur SSH- la sortie de
ssh-keygen
est presque identique au format des fichiers de clé publique.
Supprimez simplement la 1ère colonne (adresse IP ou nom d'hôte) et enregistrez-la ou dirigez-la versssh-keygen -l
qui présente l'empreinte digitale.
Daniel ajoute :
Afficher les empreintes digitales de toutes les clés publiques du serveur stockées dans
~/.ssh/know_hosts
:
cut -d' ' -f2- ~/.ssh/known_hosts | while read line; do echo "$line" | ssh-keygen -lf-; done