"git@github.com: Permission denied (publickey)": cómo solucionarlo

GitHub no aceptó ninguna de las claves que ofreció tu cliente SSH. Ejecuta ssh -vT git@github.com para ver qué claves se ofrecen. Después asegúrate de que la clave es la que añadiste a tu cuenta de GitHub, de que está cargada o indicada en ~/.ssh/config, y de que te conectas con el usuario git. No uses sudo git, que busca las claves de root. Las mismas comprobaciones sirven para GitLab con ssh -T git@gitlab.com.

Actualizada el . El texto de error de Git, ssh -G, core.sshCommand y los comandos git remote se ejecutaron con OpenSSH 10.3 y Git en macOS contra un servidor de prueba local con una clave desechable.

Lo que ves

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

La primera línea es el error real, y viene de SSH. Las líneas de Git aparecen también en muchos otros fallos, así que no dejes que te lleven a mirar el repositorio.

Probar SSH sin Git

ssh -T git@github.com

Cuando la clave se acepta, GitHub te saluda y cierra la conexión. El código de salida es 1 incluso entonces, porque GitHub no ofrece shell:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.
  • Obtienes Permission denied (publickey): sigue las causas de abajo.
  • Obtienes el saludo con un nombre distinto del esperado: SSH usa una clave de otra cuenta. Mira la causa 3.
  • Obtienes el saludo con el nombre correcto pero Git falla con Repository not found: tu cuenta no tiene acceso a ese repositorio, o la URL es incorrecta.

Causa 1: no se ofrece ninguna clave, o se ofrece la equivocada

ssh -vT git@github.com 2>&1 | grep -E 'identity file|Offering|Authentications'

Una línea que termina en type -1 significa que SSH no encontró ese archivo. SSH busca nombres por defecto como ~/.ssh/id_ed25519 y ~/.ssh/id_rsa. Sin ninguna línea Offering public key, no se probó nada. Mira qué hay disponible:

ls -l ~/.ssh/
ssh-add -l

Si tu clave tiene otro nombre de archivo, díselo a SSH en ~/.ssh/config:

Host github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github
  IdentitiesOnly yes

Comprueba el resultado sin conectar:

ssh -G github.com | grep -E '^(user|identityfile|identitiesonly) '

Si no tienes ninguna clave, sigue cómo añadir una clave SSH a GitHub.

Causa 2: la clave pública no está en tu cuenta

Compara huellas, no el aspecto de la clave:

ssh-keygen -lf ~/.ssh/id_ed25519.pub

Después abre GitHub, Settings, SSH and GPG keys, y busca el mismo valor SHA256:. Si falta, añade el contenido del archivo .pub. No pegues nunca la clave privada. Una clave usada como deploy key en un repositorio no se puede añadir además a una cuenta.

Causa 3: la cuenta equivocada

Con una cuenta de trabajo y otra personal, gana la primera clave que GitHub reconoce, aunque pertenezca a la otra cuenta. IdentitiesOnly yes, como se muestra arriba, limita SSH a la clave que indicas. Para usar dos cuentas a la vez, mira varias cuentas de GitHub.

Solo para un repositorio, puedes fijar una clave directamente:

git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_work -o IdentitiesOnly=yes"

Causa 4: el usuario equivocado en la URL

El usuario es siempre git, no tu nombre de GitHub:

git remote -v

Un remoto SSH correcto empieza por git@github.com:. Si el tuyo tiene otro nombre de usuario, vuelve a configurarlo:

git remote set-url origin git@github.com:owner/repo.git

Causa 5: sudo

sudo git pull se ejecuta como root, así que SSH busca en /root/.ssh, y tu agente suele quedar fuera de alcance. Corrige en cambio el propietario de la carpeta y ejecuta Git como tu usuario:

sudo chown -R "$USER" /path/to/repo

Causa 6: la clave no está cargada

Una clave con frase de contraseña, usada por una aplicación gráfica o un script sin forma de preguntar, falla como si no existiera. Cárgala:

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

Si eso imprime un error, mira Could not open a connection to your authentication agent.

En Mac, el agente olvida la clave tras reiniciar. Guarda la frase de contraseña en el llavero una sola vez:

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

Después añade estas dos líneas al bloque Host github.com de ~/.ssh/config, para que SSH cargue la clave solo:

  AddKeysToAgent yes
  UseKeychain yes

Otras cosas que probar

  • Permisos de la clave: si la salida menciona UNPROTECTED PRIVATE KEY FILE, mira esta solución.
  • Muchas claves en el agente: mira Too many authentication failures.
  • En CI: usa una deploy key o un token de tu sistema de CI. Las claves personales no pertenecen ahí.
  • Para salir del paso, HTTPS con un token evita SSH por completo: git remote set-url origin https://github.com/owner/repo.git.
  • Git en un servidor remoto: reenvía tu clave con el agente en vez de copiarla allí, después de leer los riesgos del agent forwarding de SSH.

Preguntas

¿Por qué Git dice Could not read from remote repository?

Es la línea genérica de Git cuando falla SSH. La causa real es la línea de arriba, aquí Permission denied (publickey): GitHub no aceptó ninguna de las claves que ofreció SSH.

¿Cómo veo qué clave envía SSH a GitHub?

Ejecuta ssh -vT git@github.com y lee las líneas Offering public key. ssh-add -l muestra las claves cargadas en el agente.

¿Por qué git pull falla solo con sudo?

sudo se ejecuta como root, así que SSH lee /root/.ssh y normalmente no llega a tu agente. Ejecuta Git con tu usuario y corrige en su lugar el propietario de la carpeta.

Fuentes

Más en Mensajes de error

Todas las guías