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_HOSTPara 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_HOSTDesde 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á:
- Ubicación del archivo: Presiona Enter para aceptar la ubicación predeterminada.
- 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:
- Abre PuTTYgen.
- Selecciona EdDSA (o RSA 4096 bits).
- Haz clic en Generate y mueve el mouse para generar aleatoriedad.
- Opcionalmente, introduce un passphrase.
- Guarda la llave privada con Save private key (archivo
.ppk). - 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.comOpción B: Manual
- Muestra tu llave pública:
cat ~/.ssh/id_ed25519.pub- Conéctate al servidor:
ssh usuario@servidor.ejemplo.com- 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_keysPaso 3: Verificar la conexión
Desconéctate y vuelve a conectarte:
ssh usuario@servidor.ejemplo.comSi 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.
- Edita el archivo de configuración de SSH:
sudo nano /etc/ssh/sshd_config- Busca y modifica la siguiente línea:
PasswordAuthentication no- Guarda el archivo y reinicia el servicio SSH:
# Ubuntu/Debian
sudo systemctl restart ssh
# AlmaLinux/CentOS/RHEL
sudo systemctl restart sshdSolució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 yesesté 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_keysno 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.comBuenas prácticas de seguridad
- Usa passphrase: Protege tu llave privada con una contraseña fuerte.
- No compartas la llave privada: Cada usuario debe tener su propio par de llaves.
- Usa Ed25519: Es más seguro y eficiente que RSA.
-
Deshabilita acceso root por SSH: Configura
PermitRootLogin noensshd_config. - Revisa regularmente authorized_keys: Elimina llaves de usuarios que ya no necesitan acceso.
- Respalda tus llaves: Guarda una copia segura de tu llave privada.