Claves SSH desde Linux y macOS para entrar sin contraseña

· 7 min de lectura · por el equipo técnico de VPS Argentina

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"
  1. Aceptá con Enter la ruta que propone.
  2. 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.
  3. 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
  1. Si SSH escucha en otro puerto, indicalo con -p: ssh-copy-id -p 2222 root@203.0.113.24.
  2. Si tenés más de una clave, elegí cuál con -i ~/.ssh/id_ed25519.pub.
  3. 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.
  4. 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 yes
  • IdentitiesOnly yes hace 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/config lo 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.

  1. Fijate si ya hay un agente con ssh-add -l. En casi todos los escritorios Linux arranca solo.
  2. Si responde "Could not open a connection to your authentication agent", arrancalo en esa terminal con eval "$(ssh-agent -s)".
  3. 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.
  4. Para no cargarla a mano, agregá AddKeysToAgent yes al bloque del servidor en ~/.ssh/config: la primera vez que la uses queda en el agente.
  5. En macOS el agente ya corre. Con UseKeychain yes en ~/.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é revisarPor qué pasaCómo se arregla
Permisos en el servidorSSH 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 computadoraTu 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 equivocadoCada 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 pegadaCada 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.
PubkeyAuthenticationSi 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 AlmaLinuxSi 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 ssh
  1. sshd -t revisa la configuración: si hay un error, lo muestra y no reinicia. El reinicio no corta las sesiones abiertas.
  2. En AlmaLinux el servicio se llama sshd: sshd -t && systemctl restart sshd.
  3. Confirmá el valor con sshd -T | grep -i passwordauthentication: tiene que decir no.
  4. Desde tu computadora, ssh -o PubkeyAuthentication=no root@203.0.113.24 ya 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