devAlice
← Mac

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

  1. Crea una clave SSH separada por cuenta (ed25519) con nombres de archivo distintos
  2. En ~/.ssh/config, establece IdentityFile + alias de Host por host explícitamente
  3. Usa alias en las URLs de clonado: git@github-work:user/repo.git en lugar de git@github.com:...
  4. Auto-ramifica user.email por directorio de trabajo con includeIf de .gitconfig
  5. El CLI gh 1.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_client

Registra 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 personal

En 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 yes

Opciones 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_client

Verificació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.git

Repo personal:

git clone git@github-personal:me/myrepo.git

Repos 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.git

Verifica 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. ~/work es 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 Name

Verificación

cd ~/work/some-repo
git config user.email
# you@company.com
 
cd ~/personal/some-repo
git config user.email
# you@personal.com

El 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.com

Cambiar 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-username

Cuenta activa por repo (opcional)

# En un repo de trabajo, activa la cuenta de trabajo
cd ~/work/repo
gh auth switch -u work-username

Los 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 autenticarse

6.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-side

Ponerlos 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_work

Puedes 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 .pub se 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 / IdentityFile de ~/.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-work

git 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.git

includeIf 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 --version

Próximos pasos

Referencias

Historial de cambios

  • 2026-05-12 — Primera versión (expansión semilla devAlice M3)