← Todas las notas← All notes

Crear llave SSH

Aug 22, 2026 · windows, powershell

Crear llave SSH ed25519

[!info] ¿Por qué ed25519? Es el algoritmo recomendado hoy: llaves cortas, más rápido y más seguro que RSA. Úsalo siempre que el servidor lo soporte (GitHub, GitLab, OpenSSH ≥ 6.5). Solo usa RSA (-t rsa -b 4096) con sistemas muy viejos.

1. Generar la llave

ssh-keygen -t ed25519 -C "correo_electronico@dominio.com"
Opción Qué hace
-t ed25519 Tipo de algoritmo
-C "..." Comentario para identificar la llave (normalmente el correo o usuario@equipo)
-f ~/.ssh/nombre Nombre/ruta del archivo (útil si tienes varias llaves)
-a 100 Rondas KDF para proteger la passphrase (más = más resistente a fuerza bruta)

Ejemplo con nombre personalizado:

ssh-keygen -t ed25519 -C "trabajo@empresa.com" -f ~/.ssh/id_ed25519_trabajo

Durante la generación:

  • Ubicación: Enter acepta la ruta por defecto ~/.ssh/id_ed25519.
  • Passphrase: recomendable ponerla. Con ssh-agent solo la escribes una vez por sesión.

Se crean dos archivos:

Archivo Descripción
id_ed25519 🔒 Llave privada, nunca se comparte ni se sube a ningún lado
id_ed25519.pub 🔓 Llave pública, es la que se copia a servidores o GitHub

[!tip] Rutas

  • Linux/macOS/Git Bash: ~/.ssh/
  • Windows (PowerShell): C:\Users\<usuario>\.ssh\

2. Agregar la llave al ssh-agent

Así no tienes que escribir la passphrase cada vez.

Linux / macOS / Git Bash

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

Windows (PowerShell como administrador, solo la primera vez)

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

macOS (guardar passphrase en el Keychain)

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Ver las llaves cargadas:

ssh-add -l

3. Copiar la llave pública

# Linux / Git Bash
cat ~/.ssh/id_ed25519.pub

# Windows (al portapapeles)
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard

# Git Bash (al portapapeles)
clip < ~/.ssh/id_ed25519.pub

# macOS (al portapapeles)
pbcopy < ~/.ssh/id_ed25519.pub

4. Usar la llave

GitHub / GitLab

  1. GitHub → Settings → SSH and GPG keys → New SSH key GitLab → Preferences → SSH Keys
  2. Pegar el contenido del .pub y ponerle un título (ej. Laptop-Windows).
  3. Probar la conexión:
ssh -T git@github.com
# Hi <usuario>! You've successfully authenticated...
  1. Clonar usando la URL SSH (git@github.com:usuario/repo.git). Para cambiar un repo existente de HTTPS a SSH:
git remote set-url origin git@github.com:usuario/repo.git

Servidor Linux (VPS, Debian, etc.)

ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor

[!note] Windows no trae ssh-copy-id Alternativa desde PowerShell:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

5. Varias llaves: archivo ~/.ssh/config

Útil para separar cuentas (personal / trabajo) o poner alias a servidores.

# GitHub personal
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes

# GitHub trabajo
Host github-trabajo
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_trabajo
    IdentitiesOnly yes

# Servidor
Host mi-vps
    HostName 203.0.113.10
    User emmanuel
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Uso:

git clone git@github-trabajo:empresa/repo.git
ssh mi-vps

6. Permisos (Linux / macOS)

SSH rechaza llaves con permisos demasiado abiertos (UNPROTECTED PRIVATE KEY FILE!).

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config

7. Comandos útiles

# Cambiar o agregar passphrase a una llave existente
ssh-keygen -p -f ~/.ssh/id_ed25519

# Ver la huella (fingerprint) de una llave
ssh-keygen -lf ~/.ssh/id_ed25519.pub

# Regenerar la pública a partir de la privada
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub

# Depurar una conexión que falla
ssh -vT git@github.com

# Eliminar un host de known_hosts (cuando cambió su huella)
ssh-keygen -R servidor

8. Problemas comunes

Error Causa probable / solución
Permission denied (publickey) La llave pública no está en el servidor/GitHub, o SSH usa otra llave → revisar ssh -vT y ~/.ssh/config
UNPROTECTED PRIVATE KEY FILE! Permisos abiertos → ver [[#6. Permisos (Linux / macOS)]]
Could not open a connection to your authentication agent El ssh-agent no está corriendo → ver [[#2. Agregar la llave al ssh-agent]]
REMOTE HOST IDENTIFICATION HAS CHANGED! El servidor se reinstaló o cambió de llave → ssh-keygen -R servidor (verificar que sea legítimo)
Pide passphrase cada vez La llave no está en el agente → ssh-add

[!warning] Seguridad

  • Nunca compartas ni subas a un repo la llave privada.
  • Usa passphrase, sobre todo en laptops.
  • Una llave por equipo: si pierdes uno, solo revocas esa llave.
  • Revoca en GitHub/servidores las llaves de equipos que ya no uses.