[guía] generar y gestionar claves ssh
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
.pubal archivo~/.ssh/authorized_keysdel 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