Load key: "invalid format" ou "error in libcrypto" avec SSH

SSH a lu le fichier de clé mais n'a pas pu l'interpréter comme une clé privée. Sur les builds Linux avec OpenSSL, le même problème s'affiche souvent sous la forme error in libcrypto. Les causes courantes sont des fins de ligne Windows, un saut de ligne final manquant, des retours à la ligne perdus dans une variable de CI, un fichier .pub ou .ppk utilisé par erreur, et une copie tronquée. Testez le fichier avec ssh-keygen -y -f keyfile, puis corrigez-le ou recopiez-le.

Mis à jour le . Chaque fichier abîmé du tableau a été fabriqué à partir d'une clé jetable et testé avec OpenSSH 10.3 sur macOS (LibreSSL) et OpenSSH 10.0 sur Debian 13 (OpenSSL).

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 voyezCauseCorrection
grep -c affiche plus de 0Fins de ligne Windows, venant d'un éditeur Windows ou d'une copie passée par Windowstr -d '\r' < key > key.fixed
xxd affiche 2d et non 0aPas de saut de ligne après la ligne ENDecho >> key
Commence par ssh-ed25519 AAAA ou ssh-rsa AAAAC'est la clé publiqueUtilisez le fichier sans .pub
Commence par PuTTY-User-Key-FileFormat PPKConvertissez-le, voir plus bas
La première ligne n'est pas -----BEGIN ..., ou la dernière n'est pas -----END ...Une partie du fichier manqueRecopiez-le depuis la source
Tout sur une seule ligne, avec des espacesLes retours à la ligne ont été perdusVoir la CI plus bas
Fichier videLa copie a échouéRecopiez-le depuis la source
file key indique UTF-16Enregistré par le > de PowerShell 5 ou par un éditeur réglé sur Unicodeiconv -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.

Sources

Autres guides : Messages d'erreur

Tous les guides