Ilustración de llaves SSH

[guía] generar y gestionar claves ssh

ed

1. Generar la llave

El algoritmo recomendado actualmente es ed25519 (más seguro y rápido que RSA):

ssh-keygen -t ed25519 -C "email@ejemplo.com"

Si necesitas RSA por compatibilidad:

ssh-keygen -t rsa -b 4096 -C "email@ejemplo.com"

Puedes cambiar el nombre del archivo para identificar la llave (útil si tienes varias):

Enter file in which to save the key (~/.ssh/id_ed25519): ~/.ssh/id_ed25519_cuenta1

Passphrase (opcional pero recomendado):

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

2. Iniciar ssh-agent y agregar la llave

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

Para que la llave se cargue automáticamente al iniciar sesión en macOS:

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

3. Copiar la llave pública

cat ~/.ssh/id_ed25519_cuenta1.pub

O directamente al portapapeles:

pbcopy < ~/.ssh/id_ed25519_cuenta1.pub   # macOS
xclip -sel clip < ~/.ssh/id_ed25519_cuenta1.pub  # Linux

4. Agregar la llave pública al servidor o proveedor

Dependiendo del caso:

  • GitHub: Settings → SSH and GPG keys → New SSH key (github.com/settings/ssh/new)
  • GitLab: Preferences → SSH Keys
  • Servidores propios: añade el contenido de .pub al archivo ~/.ssh/authorized_keys del servidor

El proceso es el mismo para todos: copias el contenido de la llave pública y lo pegas donde corresponda.

5. Verificar que funciona

Con GitHub:

ssh -T git@github.com
# Hi user! You've successfully authenticated...

Con cualquier servidor:

ssh usuario@host

Manejar múltiples cuentas o llaves

Lo más limpio es usar el archivo ~/.ssh/config. Crea o edita ese archivo:

# Conexión 1
Host conexion1
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_cuenta1

# Conexión 2
Host conexion2
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_cuenta2

Esto funciona igual con GitLab, Bitbucket o cualquier servidor SSH: simplemente cambia el HostName.

Ahora puedes clonar usando el alias del Host:

git clone git@conexion1:user/repo.git
git clone git@conexion2:user2/repo.git

Para un repo ya clonado, actualiza el remote:

git remote set-url origin git@conexion1:user/repo.git

Verificar que cada alias resuelve con la llave correcta:

ssh -T git@conexion1
ssh -T git@conexion2

Usar una llave específica sin tocar el config

Si necesitas hacer un push puntual con una llave concreta:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_cuenta1" git push -u origin master

O para clonar:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_cuenta1" git clone git@github.com:user/repo.git

También puedes exportar la variable para toda la sesión de terminal:

export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_ed25519_cuenta1"
git push
git pull
# ... todos los comandos usarán esa llave
unset GIT_SSH_COMMAND  # al terminar

Configurar la llave por repo (core.sshCommand)

Una alternativa más permanente a GIT_SSH_COMMAND es guardar el comando en la config del repo:

git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_cuenta1"

Esto queda guardado en .git/config del repo y aplica automáticamente. Para verlo:

git config --get core.sshCommand

Listar llaves cargadas en el agente

ssh-add -l

Si está vacío y tienes passphrase, añade la llave manualmente:

ssh-add ~/.ssh/id_ed25519_cuenta1

Permisos correctos (importante)

SSH es estricto con los permisos de los archivos. Si algo falla, verifica:

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