Laisser un commentaire

SSH : Connection closed by x et Could not load host key

Ce matin, alors que je viens de finir l’installation d’un VPS, après reboot, j’ai une erreur Connection closed by x.x.x.x lorsque je tente de me connecter à la machine en SSH. Bizarre…

J’installe mes serveurs automatiquement avec Ansible, l’erreur de configuration est donc peu probable. Pas de panique, je redémarre la machine en rescue et je vais inspecter les logs. Que découvré-je dans le /var/log/auth.log ?

Sep 12 11:36:08 vps454182 sshd[2033]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 12 11:36:08 vps454182 sshd[2033]: fatal: No supported key exchange algorithms [preauth]

Ah! Un problème de SSH. Si vous êtes ici, vous connaissez sans doute le principe et la configuration d’une connexion par clef ssh. Vous le savez peut-être également, mais le serveur possède un autre type de clef : les host keys.

Ce type de clef permet l’authentification du serveur par le client. Il permet d’éviter les man in the middle. Tout comme les user keys, ce type de paire de clefs possède une clef privée et une clef publique. La première reste sur le serveur tandis que la seconde est envoyée au client. Elle est stockée dans le fichier known_hosts et permet ainsi au client ssh de savoir s’il s’est déjà connecté à ce serveur et de vérifier son authenticité.

Côté serveur, ces paires de clefs sont stockées dans /etc/ssh/ssh_host_<rsa/dsa/ecdsa/ed25519>_key. Chaque type de user key possède son équivalent en host key. S’il manque la host key pour un algorithme donné, un client ne pourra pas se connecter avec une clef ssh du type en question.

Ainsi, je privilégie toujours les clefs ed25519 pour leur plus grande robustesse cryptographique. Néanmoins, en l’absence de /etc/ssh/ssh_host_ed25519_key, il m’était impossible de me connecter avec ce type de clef.

Normalement, les clefs sont générées automatiquement à l’installation d’OpenSSH. Il y a incontestablement eu un problème lors de la génération de cette dernière. On s’attache donc à re-générer nos clefs avec la commande ssh-keygen.

# on supprime d'abord les clefs existantes
rm /etc/ssh/ssh_host*

# on re-génère les clefs
ssh-keygen -A

Voilà, c’est tout. Pensez tout de même bien à chroot si vous êtes en rescue. Sinon, vous générerez les clefs du système rescue et non de celui que vous ciblez. Il n’y a plus qu’à redémarrer en mode normal.

Commentaires

Rejoignez la discussion !

Vous pouvez utiliser Markdown pour les liens [ancre de lien](url), la mise en *italique* et en **gras**. Enfin pour le code, vous pouvez utiliser la syntaxe `inline` et la syntaxe bloc

```
ceci est un bloc
de code
```