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 ves | Causa | Solución |
|---|---|---|
grep -c imprime más de 0 | Saltos de línea de Windows, de un editor de Windows o de una copia hecha a través de Windows | tr -d '\r' < key > key.fixed |
xxd muestra 2d, no 0a | No hay salto de línea tras la línea END | echo >> key |
Empieza por ssh-ed25519 AAAA o ssh-rsa AAAA | Es la clave pública | Usa el archivo sin .pub |
Empieza por PuTTY-User-Key-File | Formato PPK | Conviértelo, mira más abajo |
La primera línea no es -----BEGIN ..., o la última no es -----END ... | Falta una parte del archivo | Cópialo de nuevo desde el origen |
| Todo en una línea, con espacios | Se perdieron los saltos de línea | Mira CI más abajo |
| Archivo vacío | La copia falló | Cópialo de nuevo desde el origen |
file key indica UTF-16 | Guardado con > de PowerShell 5 o con un editor configurado en Unicode | iconv -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.