Ce que vous voyez
Load key "/home/user/.ssh/id_ed25519": invalid format
user@server: Permission denied (publickey).
Sur de nombreux systèmes Linux, le même fichier abîmé donne :
Load key "/home/user/.ssh/id_ed25519": error in libcrypto
Dans nos tests, le même fichier a donné invalid format sous macOS et error in libcrypto sous Debian. Considérez donc que c'est un seul et même problème. Une mauvaise phrase secrète a un autre aspect : incorrect passphrase supplied to decrypt private key.
SSH ne s'arrête pas là. Il continue avec d'autres clés et des mots de passe, si bien que la connexion peut échouer plus tard, voire réussir avec autre chose.
Tester le fichier sans se connecter
ssh-keygen -y -f ~/.ssh/id_ed25519
Une bonne clé affiche sa clé publique, ou demande une phrase secrète puis l'affiche. Une mauvaise affiche la même erreur Load key. file n'est pas un test fiable ici : il indique toujours OpenSSH private key pour un fichier abîmé.
Repérer ce qui ne va pas
Dans un fichier sain, ces commandes n'affichent que les lignes d'en-tête et de fin. Un fichier abîmé dont tout tient sur une seule ligne afficherait la clé entière : ne les lancez donc pas dans un journal de CI ni sur un écran partagé :
head -1 ~/.ssh/id_ed25519
tail -1 ~/.ssh/id_ed25519
tail -c 1 ~/.ssh/id_ed25519 | xxd
grep -c $'\r' ~/.ssh/id_ed25519
| Ce que vous voyez | Cause | Correction |
|---|---|---|
grep -c affiche plus de 0 | Fins de ligne Windows, venant d'un éditeur Windows ou d'une copie passée par Windows | tr -d '\r' < key > key.fixed |
xxd affiche 2d et non 0a | Pas de saut de ligne après la ligne END | echo >> key |
Commence par ssh-ed25519 AAAA ou ssh-rsa AAAA | C'est la clé publique | Utilisez le fichier sans .pub |
Commence par PuTTY-User-Key-File | Format PPK | Convertissez-le, voir plus bas |
La première ligne n'est pas -----BEGIN ..., ou la dernière n'est pas -----END ... | Une partie du fichier manque | Recopiez-le depuis la source |
| Tout sur une seule ligne, avec des espaces | Les retours à la ligne ont été perdus | Voir la CI plus bas |
| Fichier vide | La copie a échoué | Recopiez-le depuis la source |
file key indique UTF-16 | Enregistré par le > de PowerShell 5 ou par un éditeur réglé sur Unicode | iconv -f UTF-16 -t UTF-8 key > key.fixed |
Les contrôles stricts sur les fins de ligne et le saut de ligne final concernent le format récent, celui qui commence par -----BEGIN OPENSSH PRIVATE KEY-----. Dans notre test, un ancien fichier -----BEGIN RSA PRIVATE KEY----- avec le même défaut se chargeait quand même.
Après avoir écrit une copie corrigée, réglez ses permissions et testez-la. Sans cela, SSH peut la refuser pour une autre raison, voir fichier de clé privée non protégé :
chmod 600 key.fixed
ssh-keygen -y -f key.fixed
Clés dans des variables de CI
C'est une source très courante de cette erreur. Sans guillemets, le shell transforme les retours à la ligne en espaces. Et printf '%s' n'ajoute aucun saut de ligne : une variable sans saut de ligne final produit donc un mauvais fichier. Ces deux commandes ont échoué :
echo $SSH_KEY > key
printf '%s' "$SSH_KEY" > key
Celle-ci fonctionne, à condition que la variable contienne la clé complète avec ses retours à la ligne :
printf '%s\n' "$SSH_KEY" > key
chmod 600 key
ssh-keygen -y -f key > /dev/null
Lancez la dernière ligne dès le début du job, et il échouera avec une erreur claire. Faites attention à la façon dont votre système de CI traite les valeurs multilignes. Certains ne les conservent que sous forme de fichiers, et d'autres stockent du base64.
Clés PPK
OpenSSH ne lit pas les fichiers .ppk. Convertissez-les avec le générateur de clés PPK, ou sous Linux et macOS :
puttygen key.ppk -O private-openssh -o key
chmod 600 key
Détails dans Convertir une clé PPK au format OpenSSH.
Mauvais fichier dans votre configuration
Si vous ne comptiez pas utiliser cette clé, regardez d'où elle vient :
ssh -G server | grep '^identityfile '
-i key.pub et IdentityFile key.pub sont une erreur fréquente. SSH propose la clé publique, le serveur l'accepte, puis son chargement comme clé privée échoue, souvent avec bad permissions car les fichiers .pub sont lisibles par tous. Pointez-les vers le fichier privé.
Si la clé est réellement tronquée et que vous n'avez pas d'autre copie, elle ne peut pas être réparée. Générez une nouvelle clé, installez-la, et retirez l'ancienne clé publique de vos serveurs.
Pour retrouver la clé publique d'une clé privée qui fonctionne, voir obtenir la clé publique depuis la clé privée.
Questions
Quelle différence entre invalid format et error in libcrypto ?
En général aucune. Le même fichier abîmé donne invalid format avec les versions LibreSSL, comme sur macOS, et error in libcrypto avec les versions OpenSSL sous Linux.
Une clé en invalid format peut-elle être réparée ?
Souvent, si seuls les fins de ligne ou le saut de ligne final sont en cause. Une clé tronquée ne se répare pas : générez-en une nouvelle et remplacez la clé publique sur vos serveurs.
Pourquoi ma clé marche en local mais échoue en CI ?
La variable de CI a en général perdu ses sauts de ligne ou le saut de ligne final. Écrivez-la dans le fichier entre guillemets et avec un saut de ligne final, puis testez-la avec ssh-keygen -y -f.