Claves SSH desde Linux y macOS para entrar sin contraseña
Linux y macOS ya traen el cliente SSH, así que todo se hace desde la terminal. Generás un par de claves con ssh-keygen -t ed25519, copiás la pública al servidor con ssh-copy-id root@203.0.113.24 (con -p si SSH no usa el puerto 22) y a partir de ahí entrás sin la contraseña del servidor. Un alias en ~/.ssh/config te ahorra escribir la IP y ssh-agent recuerda la frase de paso durante la sesión. Si igual te pide la contraseña, casi siempre son los permisos de ~/.ssh o de authorized_keys.
Generar el par de claves
Abrí una terminal en tu computadora, no en el servidor. En macOS es la aplicación Terminal. El comando crea dos archivos en ~/.ssh: id_ed25519, la clave privada, que nunca sale de tu equipo, y id_ed25519.pub, la pública, que es la que se copia a los servidores.
Ed25519 es el tipo que conviene hoy: la clave es corta y rápida, y Debian, Ubuntu y AlmaLinux la aceptan sin configurar nada. Lo que va en -C es solo una etiqueta para saber después de qué computadora es cada clave.
ssh-keygen -t ed25519 -C "juan@notebook"- Aceptá con Enter la ruta que propone.
- Poné una frase de paso. Si alguien copia tu clave privada, sin la frase no le sirve. Con
ssh-agent, más abajo, la escribís una sola vez por sesión. - Si pregunta "Overwrite (y/n)?", ya tenés una clave con ese nombre: respondé
n. Si la pisás, perdés el acceso a los servidores que tienen cargada la anterior.
Copiar la clave pública al servidor
ssh-copy-id entra con la contraseña por última vez y agrega tu clave pública al final de ~/.ssh/authorized_keys, en la cuenta del usuario con el que te conectás. Si tiene que crear la carpeta o el archivo, los deja con los permisos que exige SSH.
ssh-copy-id root@203.0.113.24- Si SSH escucha en otro puerto, indicalo con
-p:ssh-copy-id -p 2222 root@203.0.113.24. - Si tenés más de una clave, elegí cuál con
-i ~/.ssh/id_ed25519.pub. - Probá con
ssh root@203.0.113.24. Si le pusiste frase de paso, te la va a pedir: es la de tu clave, no la contraseña del servidor. - Las versiones actuales de macOS ya traen
ssh-copy-id. Si la tuya no, esta línea hace lo mismo:cat ~/.ssh/id_ed25519.pub | ssh root@203.0.113.24 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys".
Un alias para cada servidor
En ~/.ssh/config guardás la IP, el usuario, el puerto y la clave de cada servidor bajo un nombre corto. Después alcanza con ssh produccion, y el alias también sirve para scp, rsync y ssh-copy-id.
Host produccion
HostName 203.0.113.24
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesIdentitiesOnly yeshace que se ofrezca solo esa clave. Si tenés varias cargadas y SSH las prueba todas, el servidor puede cortar con "Too many authentication failures" antes de llegar a la correcta.- El archivo tiene que ser tuyo y nadie más tiene que poder modificarlo. Si no, SSH se niega a usarlo con "Bad owner or permissions".
chmod 600 ~/.ssh/configlo deja bien.
La frase de paso, una vez por sesión
ssh-agent guarda la clave desbloqueada en memoria. Así la frase se escribe una vez y no en cada conexión.
- Fijate si ya hay un agente con
ssh-add -l. En casi todos los escritorios Linux arranca solo. - Si responde "Could not open a connection to your authentication agent", arrancalo en esa terminal con
eval "$(ssh-agent -s)". - Cargá la clave con
ssh-add ~/.ssh/id_ed25519. Te pide la frase una vez, y las conexiones que abras desde esa terminal ya no. - Para no cargarla a mano, agregá
AddKeysToAgent yesal bloque del servidor en~/.ssh/config: la primera vez que la uses queda en el agente. - En macOS el agente ya corre. Con
UseKeychain yesen~/.ssh/config, la frase queda guardada en el Llavero la primera vez que la escribís, y no la vuelve a pedir ni después de reiniciar. Esa opción es solo de macOS: en Linux da error.
Si igual te pide la contraseña
El servidor no explica por qué rechaza una clave: simplemente pasa a pedir la contraseña. Para ver qué ocurre, conectate con ssh -v root@203.0.113.24, que muestra qué claves ofrece tu equipo y qué responde el servidor. Del lado del servidor, el motivo queda en journalctl -u ssh (Debian y Ubuntu) o journalctl -u sshd (AlmaLinux). Estas son las causas más comunes.
| Qué revisar | Por qué pasa | Cómo se arregla |
|---|---|---|
| Permisos en el servidor | SSH ignora authorized_keys si el archivo, la carpeta ~/.ssh o la carpeta personal pueden ser modificados por otros usuarios. En el registro figura como "bad ownership or modes". | chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys y chmod go-w ~. Si los creaste como root para otro usuario, cambiá el dueño con chown -R juan:juan /home/juan/.ssh. |
| Permisos en tu computadora | Tu equipo no usa una clave privada que otros pueden leer, y avisa con "UNPROTECTED PRIVATE KEY FILE". | chmod 700 ~/.ssh y chmod 600 ~/.ssh/id_ed25519. |
| El usuario equivocado | Cada usuario tiene su propio authorized_keys. Si copiaste la clave a root y entrás como juan, o al revés, no la encuentra. | Copiala con el mismo usuario con el que te conectás. |
| Una clave mal pegada | Cada clave va en una sola línea que empieza con ssh-ed25519. Si quedó cortada en dos o le falta un pedazo, no sirve. | Borrá esa línea y volvé a copiarla con ssh-copy-id. |
PubkeyAuthentication | Si en /etc/ssh/sshd_config o en /etc/ssh/sshd_config.d/ quedó en no, el servidor no acepta claves. | Mirá el valor que usa con sshd -T | grep -i pubkeyauthentication: tiene que decir yes. |
| SELinux, en AlmaLinux | Si la carpeta ~/.ssh se copió o se movió desde otro lugar, puede tener una etiqueta que SSH no tiene permitido leer. | restorecon -Rv ~/.ssh le devuelve la etiqueta correcta. |
Apagar el acceso con contraseña
Con la clave funcionando, conviene cerrar la puerta que más prueban los bots. En el servidor, como root, dejá la opción en un archivo propio dentro de /etc/ssh/sshd_config.d/. El 00 del nombre importa: SSH se queda con el primer valor que lee, y esos archivos se leen antes que el resto de sshd_config. Así ningún otro, como el 50-cloud-init.conf de algunas imágenes, vuelve a habilitarla.
echo "PasswordAuthentication no" > /etc/ssh/sshd_config.d/00-sin-contrasena.conf
sshd -t && systemctl restart sshsshd -trevisa la configuración: si hay un error, lo muestra y no reinicia. El reinicio no corta las sesiones abiertas.- En AlmaLinux el servicio se llama
sshd:sshd -t && systemctl restart sshd. - Confirmá el valor con
sshd -T | grep -i passwordauthentication: tiene que decirno. - Desde tu computadora,
ssh -o PubkeyAuthentication=no root@203.0.113.24ya tiene que responder "Permission denied" sin pedirte la contraseña.
Preguntas frecuentes
¿Conviene una clave por computadora?
Sí. Si perdés la notebook, borrás su línea de authorized_keys en el servidor y las demás siguen andando. El comentario que pusiste con -C te dice cuál es cuál.
¿Me sirve la clave RSA que ya tengo?
Si es de 2048 bits o más, sí: Debian 12, Ubuntu 24.04 y AlmaLinux 9 la aceptan. El tamaño lo ves con ssh-keygen -l -f ~/.ssh/id_rsa.pub. Una de 1024 bits ya es débil y conviene reemplazarla. Para una nueva, usá ed25519.
¿Puedo agregar o cambiar la frase de paso después?
Sí, sin tocar el servidor: ssh-keygen -p -f ~/.ssh/id_ed25519 te pide la actual y la nueva. La clave pública no cambia, así que no hay que volver a copiarla.
¿Cómo le saco el acceso a una clave?
Borrá su línea de ~/.ssh/authorized_keys en el servidor. Cada clave ocupa una línea y termina con su comentario, así que es fácil encontrarla. Vale desde la próxima conexión: las sesiones abiertas siguen hasta que se cierran.
Seguí leyendo
Cómo conectarte por SSH a tu servidor Linux desde Windows
Con la terminal que ya trae Windows 10 y 11, sin instalar nada: la primera conexión, las claves SSH, PuTTY como alternativa y qué hacer si no conecta.
Cómo crear un usuario administrador con sudo en Linux
Un usuario propio con sudo en Debian, Ubuntu y AlmaLinux, en vez de un segundo root: cómo crearlo, probarlo, cargarle tu clave SSH y limitar el acceso de root.
Firewall y fail2ban en tu VPS con ufw o firewalld
Cómo activar ufw o firewalld sin quedarte afuera de tu VPS, qué puertos abrir y cómo frenar con fail2ban los intentos de entrar por SSH.