Cómo configurar autenticación SSH con llaves públicas

La autenticación con llaves públicas permite conectarte a un servidor SSH sin usar contraseña, utilizando un par de llaves criptográficas. Este método es más seguro que las contraseñas tradicionales y facilita la automatización de tareas.

Cómo funciona

El sistema utiliza un par de llaves:

  • Llave privada: Se guarda en tu computadora local. Nunca debe compartirse.
  • Llave pública: Se copia al servidor. Puede compartirse libremente.

Cuando te conectas, el servidor verifica que posees la llave privada correspondiente a la llave pública registrada.

Requisitos previos

  • Acceso SSH al servidor con usuario y contraseña (para la configuración inicial)
  • Cliente SSH instalado en tu computadora local

Método rápido

Desde Linux / macOS

Ejecuta el siguiente comando, reemplazando los valores según tu configuración:

REMOTE_USER="usuario"
REMOTE_HOST="servidor.ejemplo.com"
REMOTE_PORT="22"

# Genera la llave (si no existe) y la copia al servidor
if [ ! -f ~/.ssh/id_ed25519 ]; then
    ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
fi
ssh-copy-id -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST

Para sistemas que no soportan Ed25519, usa RSA:

REMOTE_USER="usuario"
REMOTE_HOST="servidor.ejemplo.com"
REMOTE_PORT="22"

if [ ! -f ~/.ssh/id_rsa ]; then
    ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa
fi
ssh-copy-id -p $REMOTE_PORT $REMOTE_USER@$REMOTE_HOST

Desde Windows (PowerShell)

Ejecuta el siguiente comando, reemplazando los valores según tu configuración:

$REMOTE_USER = "usuario"
$REMOTE_HOST = "servidor.ejemplo.com"
$REMOTE_PORT = "22"

# Genera la llave si no existe
if (!(Test-Path "$env:USERPROFILE\.ssh\id_ed25519")) {
    ssh-keygen -t ed25519 -N '""' -f "$env:USERPROFILE\.ssh\id_ed25519"
}

# Copia la llave pública al servidor
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh -p $REMOTE_PORT "$REMOTE_USER@$REMOTE_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Para sistemas que no soportan Ed25519, usa RSA:

$REMOTE_USER = "usuario"
$REMOTE_HOST = "servidor.ejemplo.com"
$REMOTE_PORT = "22"

if (!(Test-Path "$env:USERPROFILE\.ssh\id_rsa")) {
    ssh-keygen -t rsa -b 4096 -N '""' -f "$env:USERPROFILE\.ssh\id_rsa"
}

Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub" | ssh -p $REMOTE_PORT "$REMOTE_USER@$REMOTE_HOST" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Una vez ejecutado, verifica la conexión:

ssh -p $REMOTE_PORT "$REMOTE_USER@$REMOTE_HOST"

Método manual paso a paso

Si prefieres realizar el proceso manualmente o el método rápido no funciona, sigue estos pasos.

Paso 1: Generar el par de llaves

Linux / macOS

ssh-keygen -t ed25519 -C "tu-correo@ejemplo.com"

Windows (PowerShell)

ssh-keygen -t ed25519 -C "tu-correo@ejemplo.com"

El comando te pedirá:

  1. Ubicación del archivo: Presiona Enter para aceptar la ubicación predeterminada.
  2. Passphrase: Introduce una contraseña para proteger la llave privada (recomendado) o presiona Enter para dejarla vacía.

Windows (PuTTYgen)

Si usas PuTTY en lugar de OpenSSH:

  1. Abre PuTTYgen.
  2. Selecciona EdDSA (o RSA 4096 bits).
  3. Haz clic en Generate y mueve el mouse para generar aleatoriedad.
  4. Opcionalmente, introduce un passphrase.
  5. Guarda la llave privada con Save private key (archivo .ppk).
  6. Copia el texto del campo "Public key for pasting into OpenSSH authorized_keys file".

Paso 2: Copiar la llave pública al servidor

Opción A: Usando ssh-copy-id (Linux/macOS)

ssh-copy-id -p 22 usuario@servidor.ejemplo.com

Opción B: Manual

  1. Muestra tu llave pública:
cat ~/.ssh/id_ed25519.pub
  1. Conéctate al servidor:
ssh usuario@servidor.ejemplo.com
  1. Crea el directorio y archivo si no existen, y añade la llave:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "tu-llave-publica-completa" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Paso 3: Verificar la conexión

Desconéctate y vuelve a conectarte:

ssh usuario@servidor.ejemplo.com

Si todo está correcto, accederás sin introducir la contraseña del servidor.

Deshabilitar autenticación por contraseña (opcional)

Una vez verificado que la autenticación con llaves funciona, puedes deshabilitar el acceso por contraseña para mayor seguridad.

Advertencia: Asegúrate de que la autenticación con llaves funciona antes de deshabilitar las contraseñas, o podrías quedarte sin acceso al servidor.

  1. Edita el archivo de configuración de SSH:
sudo nano /etc/ssh/sshd_config
  1. Busca y modifica la siguiente línea:
PasswordAuthentication no
  1. Guarda el archivo y reinicia el servicio SSH:
# Ubuntu/Debian
sudo systemctl restart ssh

# AlmaLinux/CentOS/RHEL
sudo systemctl restart sshd

Solución de problemas

Permission denied (publickey)

  • Verifica los permisos en el servidor:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
  • Confirma que la llave pública está correctamente copiada en authorized_keys.
  • Verifica que estás usando la llave privada correcta.

La conexión sigue pidiendo contraseña

  • Verifica que PubkeyAuthentication yes esté en /etc/ssh/sshd_config (está habilitado por defecto en la mayoría de servidores).
  • Revisa los logs del servidor:
sudo tail -f /var/log/auth.log        # Ubuntu/Debian
sudo tail -f /var/log/secure          # AlmaLinux/CentOS
  • Asegúrate de que el archivo authorized_keys no tenga líneas rotas (cada llave debe estar en una sola línea).

La llave no se encuentra

  • Verifica que la llave exista:
ls -la ~/.ssh/
  • Si usas una ubicación personalizada, especifícala al conectarte:
ssh -i /ruta/a/tu/llave usuario@servidor.ejemplo.com

Buenas prácticas de seguridad

  1. Usa passphrase: Protege tu llave privada con una contraseña fuerte.
  2. No compartas la llave privada: Cada usuario debe tener su propio par de llaves.
  3. Usa Ed25519: Es más seguro y eficiente que RSA.
  4. Deshabilita acceso root por SSH: Configura PermitRootLogin no en sshd_config.
  5. Revisa regularmente authorized_keys: Elimina llaves de usuarios que ya no necesitan acceso.
  6. Respalda tus llaves: Guarda una copia segura de tu llave privada.

Referencias