Múltiples cuentas GitHub vía SSH en Mac: gestiona claves de trabajo y personales
La forma directa de separar limpiamente múltiples hosts y cuentas (GitHub de trabajo, GitHub personal, clientes externos) con ~/.ssh/config.
Tener una cuenta de GitHub de trabajo y una personal en la misma máquina genera problemas desde el primer día: git push va a la cuenta incorrecta, los repos recién clonados rechazan con «permiso denegado» y el CLI de gh sigue iniciando sesión en la misma cuenta. Esta guía explica la forma directa de separar cuentas y hosts vía ~/.ssh/config en macOS 14+ / OpenSSH 9.x.
Un seguimiento de la configuración inicial de Mac, donde creaste una clave ed25519. Se extiende a GitLab/Bitbucket para clientes externos también.
TL;DR
- Crea una clave SSH separada por cuenta (ed25519) con nombres de archivo distintos
- En
~/.ssh/config, estableceIdentityFile+ alias deHostpor host explícitamente - Usa alias en las URLs de clonado:
git@github-work:user/repo.giten lugar degit@github.com:... - Auto-ramifica
user.emailpor directorio de trabajo conincludeIfde.gitconfig - El CLI
gh1.x+ soporta múltiples cuentas simultáneas
Requisitos previos
- macOS 14+, OpenSSH 9.x (
ssh -V) - Una cuenta de GitHub/GitLab para cada perfil
- Una configuración existente de clave única de la configuración inicial de Mac o equivalente
1. Claves SSH por cuenta — 5 min
Usa nombres de archivo intencionalmente distintos.
# Cuenta de trabajo
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work
# Cuenta personal
ssh-keygen -t ed25519 -C "personal@example.com" -f ~/.ssh/id_ed25519_personal
# Cliente externo (opcional)
ssh-keygen -t ed25519 -C "client-foo@example.com" -f ~/.ssh/id_ed25519_clientRegistra solo la clave pública en cada cuenta de GitHub/GitLab:
pbcopy < ~/.ssh/id_ed25519_work.pub # GitHub de trabajo
pbcopy < ~/.ssh/id_ed25519_personal.pub # GitHub personalEn un navegador, visita https://github.com/settings/ssh/new, inicia sesión como cada cuenta, pega, guarda.
GitHub rechaza reutilizar la misma clave en dos cuentas («Key is already in use»). Por eso la separación de claves por cuenta es obligatoria.
2. Crear ~/.ssh/config — 10 min
Segmenta con alias de host. Se integra con macOS Keychain y Touch ID.
# ~/.ssh/config
# GitHub de trabajo
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
# GitHub personal
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
# GitLab de cliente
Host gitlab-client
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_client
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yesOpciones clave:
IdentitiesOnly yes— incluso si el agente tiene otras claves, solo se usa la explícita. Sin esto, la clave incorrecta se intenta primero y GitHub devuelve 403.AddKeysToAgent yes+UseKeychain yes— integración con macOS Keychain. Frase de contraseña ingresada una vez, nunca más.
Añadir claves al agente SSH
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_personal
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_clientVerificación
ssh -T git@github-work
# Hi work-username! You've successfully authenticated...
ssh -T git@github-personal
# Hi personal-username! You've successfully authenticated...Si recibes el saludo de la cuenta incorrecta, ve a §3 / solución de problemas.
3. Usa alias en las URLs de clonado — el patrón diario
Repo de trabajo:
# URL de GitHub sin alias — IdentitiesOnly seguirá eligiendo la clave correcta, pero usar un alias explícito es más limpio
git clone git@github.com:org/repo.git # IdentitiesOnly + primera coincidencia — ambiguo
# Usa alias — explícito
git clone git@github-work:org/repo.gitRepo personal:
git clone git@github-personal:me/myrepo.gitRepos ya clonados: cambia el remote.
cd ~/work/repo
git remote set-url origin git@github-work:org/repo.git
cd ~/personal/myrepo
git remote set-url origin git@github-personal:me/myrepo.gitVerifica con git remote -v.
4. Ramificación automática de user.email con includeIf — 5 min
Selecciona git config user.email en función de la carpeta de trabajo. Los commits en la carpeta de trabajo usan el correo de trabajo; los de la carpeta personal, el correo personal.
~/.gitconfig principal
[user]
name = Your Name
# Deja el email predeterminado en blanco o usa el más común
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personal⚠️ La ruta después de
gitdir:debe terminar con barra diagonal.~/workes incorrecto,~/work/es correcto.
~/.gitconfig-work
[user]
email = you@company.com
name = Your Name (Company)
[commit]
gpgsign = true # si la política de trabajo requiere commits firmados
[gpg]
format = ssh
[gpg "ssh"]
defaultKeyCommand = ssh-add -L
program = ssh-keygen~/.gitconfig-personal
[user]
email = you@personal.com
name = Your NameVerificación
cd ~/work/some-repo
git config user.email
# you@company.com
cd ~/personal/some-repo
git config user.email
# you@personal.comEl enrutamiento automático funciona. Esto evita estructuralmente los commits con el correo incorrecto.
5. CLI gh con múltiples cuentas: autenticación simultánea
gh 2.40+ admite múltiples cuentas. Puedes tener iniciada sesión con la cuenta de trabajo y la personal al mismo tiempo desde la misma máquina.
Añadir autenticación
# Primera cuenta (omitir si ya está conectado)
gh auth login
# Segunda cuenta
gh auth login # inicia sesión como una cuenta diferente de GitHub.comCambiar cuenta activa
gh auth status
# Lista todas las cuentas conectadas y la activa
gh auth switch
# Interactivo — elige otra cuenta
gh auth switch -u personal-usernameCuenta activa por repo (opcional)
# En un repo de trabajo, activa la cuenta de trabajo
cd ~/work/repo
gh auth switch -u work-usernameLos comandos de gh usan la cuenta activa. SSH se ramifica por configuración en §2, así que sin conflicto.
6. Problemas habituales
6.1 Conflictos de Personal Access Token (PAT)
Si elegiste HTTPS en gh auth login, el PAT se almacena en el Keychain del sistema. Si se usa el PAT incorrecto para otras cuentas:
gh auth status # qué PAT está almacenado dónde
security find-internet-password -s github.com -a "your-username"
security delete-internet-password -s github.com -a "wrong-username"
gh auth login # volver a autenticarse6.2 La misma organización accedida por ambas cuentas
Si tu cuenta personal también es colaboradora en la org de GitHub de trabajo, las URLs de clonado se vuelven ambiguas:
# Usa alias explícitos
git clone git@github-work:org/shared-repo.git work-side
git clone git@github-personal:org/shared-repo.git personal-sidePonerlos en directorios separados divide las elecciones de user.email + clave.
6.3 macOS Keychain olvida la frase de contraseña
UseKeychain yes en ~/.ssh/config se ignora en algunas configuraciones de macOS 15+. Solución alternativa:
# Inicia explícitamente ssh-agent + añade clave
eval "$(ssh-agent -s)"
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_workPuedes añadir el fragmento de auto-registro a .zshrc si es necesario.
7. Lista de verificación de seguridad
- Nunca compartas claves privadas: solo el archivo
.pubse registra. - Usa frase de contraseña: cifra el archivo de clave. macOS Keychain lo almacena en caché tras una primera entrada.
- Separa claves de trabajo y personales: limita el impacto si una se filtra.
- Permisos de
~/.ssh/config:chmod 600 ~/.ssh/config - Permisos del directorio
~/.ssh:chmod 700 ~/.ssh - Claves hardware (opcional): YubiKey + FIDO2 vía
ssh-keygen -t ed25519-sk(guía aparte)
8. Solución de problemas
Permission denied (publickey) a pesar de clave explícita
Falta IdentitiesOnly yes — las otras claves del agente se intentan primero y se deniegan. Añade a la configuración.
ssh -vT git@github-work 2>&1 | grep -E "(Offering|identity file)"Si se intentan múltiples claves, falta IdentitiesOnly yes.
Saludado como la cuenta incorrecta
ssh -T git@github-work devuelve la cuenta personal. Causas:
- Clave incorrecta priorizada en el ssh-agent
- Orden de bloques o error tipográfico en
Host github-work/IdentityFilede~/.ssh/config
ssh-add -L # qué claves están en el agente
ssh-add -D # borrar todas
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
ssh -T git@github-workgit push va a personal
La URL es git@github.com:org/repo.git y la clave personal gana en el agente. Cambia la URL.
git remote set-url origin git@github-work:org/repo.gitincludeIf no se activa
- Falta la barra diagonal al final de la ruta (
~/work❌,~/work/✅) - La carpeta es un symlink — depende del SO. Usa la ruta real.
gh auth switch no disponible
gh es anterior a 2.40. Actualiza:
brew upgrade gh
gh --versionPróximos pasos
- Configuración inicial de Mac: generación de la primera clave SSH
- Dotfiles de Mac: gestiona
.ssh/configy.gitconfigcomo dotfiles - Gestión de Brewfile: congela el resto de tu entorno de desarrollo
Referencias
Historial de cambios
- 2026-05-12 — Primera versión (expansión semilla devAlice M3)