Load key: "invalid format" o "error in libcrypto"

SSH leyó el archivo de clave y no pudo interpretarlo como clave privada. En Linux con OpenSSL el mismo problema suele aparecer como error in libcrypto. Las causas habituales son los saltos de línea de Windows, la falta de un salto de línea al final, saltos de línea perdidos en una variable de CI, un archivo .pub o .ppk usado por error y una copia truncada. Prueba el archivo con ssh-keygen -y -f keyfile, y luego arréglalo o cópialo de nuevo.

Actualizada el . Cada archivo dañado de la tabla se creó a partir de una clave desechable y se probó con OpenSSH 10.3 en macOS (LibreSSL) y OpenSSH 10.0 en Debian 13 (OpenSSL).

Qué ves

Load key "/home/user/.ssh/id_ed25519": invalid format
user@server: Permission denied (publickey).

En muchos sistemas Linux el mismo archivo dañado da:

Load key "/home/user/.ssh/id_ed25519": error in libcrypto

En nuestras pruebas el mismo archivo dio invalid format en macOS y error in libcrypto en Debian. Trátalos como un solo problema. Una frase de contraseña incorrecta se ve distinta: incorrect passphrase supplied to decrypt private key.

SSH no se detiene aquí. Sigue con otras claves y contraseñas, así que el inicio de sesión puede fallar más tarde o incluso funcionar con otra cosa.

Prueba el archivo sin conectar

ssh-keygen -y -f ~/.ssh/id_ed25519

Una clave buena imprime su clave pública, o pide la frase de contraseña y luego la imprime. Una mala imprime el mismo error Load key. file no es una prueba fiable aquí: sigue indicando OpenSSH private key para un archivo dañado.

Comprueba qué le pasa

En un archivo sano estos comandos solo imprimen las líneas de inicio y de fin. Un archivo dañado con todo en una línea mostraría la clave entera, así que no los ejecutes en un log de CI ni en una pantalla compartida:

head -1 ~/.ssh/id_ed25519
tail -1 ~/.ssh/id_ed25519
tail -c 1 ~/.ssh/id_ed25519 | xxd
grep -c $'\r' ~/.ssh/id_ed25519
Lo que vesCausaSolución
grep -c imprime más de 0Saltos de línea de Windows, de un editor de Windows o de una copia hecha a través de Windowstr -d '\r' < key > key.fixed
xxd muestra 2d, no 0aNo hay salto de línea tras la línea ENDecho >> key
Empieza por ssh-ed25519 AAAA o ssh-rsa AAAAEs la clave públicaUsa el archivo sin .pub
Empieza por PuTTY-User-Key-FileFormato PPKConviértelo, mira más abajo
La primera línea no es -----BEGIN ..., o la última no es -----END ...Falta una parte del archivoCópialo de nuevo desde el origen
Todo en una línea, con espaciosSe perdieron los saltos de líneaMira CI más abajo
Archivo vacíoLa copia fallóCópialo de nuevo desde el origen
file key indica UTF-16Guardado con > de PowerShell 5 o con un editor configurado en Unicodeiconv -f UTF-16 -t UTF-8 key > key.fixed

Las comprobaciones estrictas de los saltos de línea y del salto final se aplican al formato nuevo, el que empieza por -----BEGIN OPENSSH PRIVATE KEY-----. Un archivo antiguo -----BEGIN RSA PRIVATE KEY----- con el mismo daño se cargó igualmente en nuestra prueba.

Después de escribir una copia corregida, ajusta sus permisos y pruébala. Si no, SSH puede rechazarla por otro motivo, mira archivo de clave privada sin proteger:

chmod 600 key.fixed
ssh-keygen -y -f key.fixed

Claves en variables de CI

Es una fuente muy común de este error. Sin comillas, la shell convierte los saltos de línea en espacios. Y printf '%s' no añade salto de línea, así que una variable sin salto final produce un archivo incorrecto. Estos dos fallaron:

echo $SSH_KEY > key
printf '%s' "$SSH_KEY" > key

Esto funciona, siempre que la variable contenga la clave completa con sus saltos de línea:

printf '%s\n' "$SSH_KEY" > key
chmod 600 key
ssh-keygen -y -f key > /dev/null

Ejecuta la última línea como un paso temprano del trabajo y fallará con un error claro. Ten en cuenta lo que hace tu sistema de CI con los valores de varias líneas. Algunos solo los conservan si se guardan como archivos, y otros guardan base64.

Claves PPK

OpenSSH no lee archivos .ppk. Conviértelas con el generador de claves PPK, o en Linux y macOS:

puttygen key.ppk -O private-openssh -o key
chmod 600 key

Detalles en Convertir una clave PPK a OpenSSH.

Archivo equivocado en tu configuración

Si nunca quisiste usar esta clave, mira de dónde sale:

ssh -G server | grep '^identityfile '

-i key.pub e IdentityFile key.pub son un error frecuente. SSH ofrece la clave pública, el servidor la acepta y luego cargarla como clave privada falla, a menudo con bad permissions porque los archivos .pub los puede leer cualquiera. Apúntalos al archivo privado.

Si la clave está de verdad truncada y no tienes otra copia, no se puede reparar. Genera una clave nueva, instálala y elimina la clave pública antigua de tus servidores.

Para obtener la clave pública de una clave privada que funciona, consulta cómo sacar la clave pública de la privada.

Preguntas

¿Qué diferencia hay entre invalid format y error in libcrypto?

Normalmente ninguna. El mismo archivo dañado da invalid format con las versiones LibreSSL, como en macOS, y error in libcrypto con las versiones OpenSSL en Linux.

¿Se puede reparar una clave con invalid format?

A menudo sí, si solo fallan los finales de línea o el salto de línea final. Una clave truncada no se repara: genera una nueva y sustituye la clave pública en tus servidores.

¿Por qué mi clave funciona en local pero falla en CI?

La variable de CI suele haber perdido los saltos de línea o el salto final. Escríbela en el archivo entre comillas y con un salto de línea final, y pruébala con ssh-keygen -y -f.

Fuentes

Más en Mensajes de error

Todas las guías