Escribir la contraseña cada vez que te conectas por SSH es incómodo y poco seguro. Esta vez configuraremos la conexión por clave pública/privada: el servidor nos pedirá la contraseña de la clave privada en lugar de la contraseña del usuario, y con ssh-agent ni siquiera eso. Es el método que usan GitHub, GitLab y cualquier bastión de producción.
🤔 ¿Qué vamos a conseguir?
- Disponer de un par de claves (pública y privada) generado en el equipo cliente.
- Copiar la clave pública al servidor y añadirla a
authorized_keys. - Conectarnos por SSH sin teclear la contraseña del usuario servidor.
- Entender el mecanismo de autenticación de clave pública para no volver a usar contraseñas.
🧰 Prerrequisitos
- Un servidor SSH funcionando (dudas: Formas de conectarse por SSH).
- Ser capaz de conectar por contraseña al menos una vez (aún no tenemos la clave configurada).
- Conocer tu usuario en el servidor y su IP.
🔑 Generar el par de claves
En el equipo cliente abrimos una terminal y generamos el par de claves. Aceptamos la ubicación por defecto (~/.ssh/id_rsa) y elegimos una passphrase para proteger la clave privada:
ssh-keygen -t rsa -b 4096
El comando nos pide dónde guardarlas y una passphrase (puede estar vacía, pero mejor ponerla). El resultado son estos 3 archivos en ~/.ssh/:
id_rsa— la clave privada (¡nunca sale de tu máquina!).id_rsa.pub— la clave pública, la que copiamos al servidor.known_hosts— las huellas de los servidores a los que te has conectado.

📤 Copiar la clave pública al servidor
La forma más cómoda es ssh-copy-id, que además crea el directorio .ssh y el fichero authorized_keys si no existen:
ssh-copy-id jorge@192.168.101.1
Te pedirá la contraseña del usuario por última vez y, a partir de ahí, la conexión usará la clave pública.
Variante manual con scp
Si tu servidor no tiene ssh-copy-id (o para entender qué pasa por debajo), genera el fichero manualmente:
En el servidor creamos la carpeta .ssh en casa del usuario (si no existe):
mkdir -p ~/.ssh
En el cliente copiamos el fichero id_rsa.pub al servidor:
scp ~/.ssh/id_rsa.pub jorge@192.168.101.1:~/.ssh
📁 Autorizarlas en el servidor
Entra en el servidor y verás que el fichero id_rsa.pub ya está dentro de .ssh. Ahora hay que añadirlo al fichero de claves autorizadas. La concatenación (>>, dos veces mayor que) añade sin borrar lo que ya había:
cat id_rsa.pub >> authorized_keys
⚠️ Cuidado: con
>>añades; con un solo> authorize_keysmachacarías el fichero y perderías todas las claves existentes.
Por seguridad, los permisos deben impedir que otros usuarios lean o escriban estos ficheros:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
✅ Probar la conexión
Desde el cliente, conéctate como siempre:
ssh jorge@192.168.101.1
Si tu clave privada no tiene passphrase, entrarás directamente sin contraseña. Si la configuraste, te pedirá la passphrase de la clave privada (no la del usuario). Para no repetirla en cada conexión, añádela al agente:
ssh-add ~/.ssh/id_rsa
Y si quieres que OpenSSH solo acepte claves (nada de contraseñas), en el servidor edita /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
Reinicia con sudo systemctl restart ssh (¡asegúrate de tener la clave funcionando antes, o te quedarás fuera!).
⚠️ Errores comunes
| Error | Causa | Solución |
|---|---|---|
Permission denied (publickey,password) | Clave no autorizada en el servidor | Revisa authorized_keys y los permisos (chmod 600) |
Permissions too open | ~/.ssh o claves con permisos demasiado abiertos | chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_rsa |
No supported authentication methods | El servidor tiene PasswordAuthentication no y la clave no está bien | Vuelve a conectar por consola física y revisa authorized_keys |
Load key "id_rsa": bad permissions | Clave privada legible por otros | chmod 600 ~/.ssh/id_rsa |
No te conecta SSH remoto por copiar con sudo cat | El fichero authorized_keys pertenece a root | chown jorge:jorge ~/.ssh -R |
🪜 Siguiente nivel
- Céntrate en la seguridad: desactiva
PasswordAuthentication noensshd_configpara blindar el acceso. - Git sin contraseñas: sube la misma clave pública a GitHub/GitLab y haz push/pull sin credenciales.
- Multiples servidores: configura
~/.ssh/configconIdentityFilepor servidor (mira Formas de conectarse por SSH). - Copia de backups: usa
scpyrsynccon la clave para automatizar copias: Copiar archivos entre diferentes usuarios y máquinas.
