Conexión mediante clave pública privada

Conexión mediante clave pública privada

Aprende a conectarte por SSH con autenticación por clave pública y privada en vez de contraseña: genera el par de claves, cópialo al servidor, créalo en authorized_keys y prueba el acceso sin contraseña.

FECHA:
ACTUALIZADO:
AUTOR:Jorge Beneyto Castelló
LECTURA:5 MINUTOS DE LECTURA

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.
Par de claves generadas con ssh-keygen

📤 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_keys machacarí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

ErrorCausaSolución
Permission denied (publickey,password)Clave no autorizada en el servidorRevisa authorized_keys y los permisos (chmod 600)
Permissions too open~/.ssh o claves con permisos demasiado abiertoschmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys ~/.ssh/id_rsa
No supported authentication methodsEl servidor tiene PasswordAuthentication no y la clave no está bienVuelve a conectar por consola física y revisa authorized_keys
Load key "id_rsa": bad permissionsClave privada legible por otroschmod 600 ~/.ssh/id_rsa
No te conecta SSH remoto por copiar con sudo catEl fichero authorized_keys pertenece a rootchown jorge:jorge ~/.ssh -R

🪜 Siguiente nivel

  1. Céntrate en la seguridad: desactiva PasswordAuthentication no en sshd_config para blindar el acceso.
  2. Git sin contraseñas: sube la misma clave pública a GitHub/GitLab y haz push/pull sin credenciales.
  3. Multiples servidores: configura ~/.ssh/config con IdentityFile por servidor (mira Formas de conectarse por SSH).
  4. Copia de backups: usa scp y rsync con la clave para automatizar copias: Copiar archivos entre diferentes usuarios y máquinas.

🔗 Enlaces y recursos

COMPARTIR:
COMENTARIOS:

📋 Contenido