Generar una clave
Sáltate esto si ya tienes una, lo que puedes ver con ls ~/.ssh/*.pub.
ssh-keygen -t ed25519 -C "you@example.com"
Acepta el archivo por defecto y pon una frase de contraseña. En Windows, mira generar una clave en Windows.
¿No sabes qué tipo elegir? Consulta claves SSH RSA o ed25519.
Copiar la clave pública
pbcopy < ~/.ssh/id_ed25519.pub # macOS
cat ~/.ssh/id_ed25519.pub # Linux: copy the output by hand
En Windows, usa Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard. Es una sola línea que empieza por ssh-ed25519. Si lo que tienes empieza por -----BEGIN, es la clave privada: detente y no la pegues en ningún sitio.
Añadirla en GitHub
- Haz clic en tu foto de perfil, arriba a la derecha, y luego en Settings.
- En la sección Access de la barra lateral, haz clic en SSH and GPG keys.
- Haz clic en New SSH key.
- Ponle un título que nombre el equipo, como "Portátil personal".
- Elige el tipo de clave Authentication. Signing es un uso distinto: para firmar commits con la misma clave, súbela una segunda vez como Signing.
- Pega la clave sin añadir saltos de línea y haz clic en Add SSH key.
Con la herramienta de línea de comandos de GitHub, tras gh auth login:
gh ssh-key add ~/.ssh/id_ed25519.pub --title "Personal laptop"
GitHub ya no acepta claves DSA. Si una organización a la que perteneces usa inicio de sesión único SAML, puede que también tengas que autorizar la clave para ella en la misma página.
Probarla y comprobar la huella
ssh -T git@github.com
La primera vez, ssh pregunta si confías en el host. Compara lo que muestra con la lista que publica GitHub. Comprobamos que estos valores coinciden con lo que envía github.com:
| Tipo | Huella SHA256 |
|---|---|
| Ed25519 | SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU |
| ECDSA | SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM |
| RSA | SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s |
GitHub puede cambiarlas, así que su propia página es la referencia. Un acceso correcto imprime:
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
Si en cambio obtienes un error, mira git@github.com: Permission denied (publickey).
Por qué ssh pregunta la primera vez y cómo leer la pregunta: known_hosts y huellas del host explicados.
Haz que tu repositorio use SSH
Una clave no sirve de nada para un repositorio clonado por HTTPS. Compruébalo y cámbialo si hace falta:
git remote -v
git remote set-url origin git@github.com:OWNER/REPO.git
Para un clon nuevo, usa la misma forma de dirección:
git clone git@github.com:OWNER/REPO.git
Si Git pide la frase de contraseña o usa la clave equivocada
Carga la clave en ssh-agent una vez por sesión con ssh-add ~/.ssh/id_ed25519. En Mac, el Llavero puede guardar la frase tras un reinicio: consulta ssh-agent y el Llavero de macOS.
Si tu clave tiene otro nombre, indica a ssh cuál usar para GitHub en ~/.ssh/config:
Host github.com
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
Para una segunda cuenta de GitHub en el mismo equipo, consulta varias cuentas de GitHub con SSH.
Si el puerto 22 está bloqueado
Algunas redes lo bloquean, lo que se manifiesta como un timeout. GitHub también acepta SSH en el puerto 443:
ssh -T -p 443 git@ssh.github.com
Si funciona, hazlo permanente en ~/.ssh/config:
Host github.com
Hostname ssh.github.com
Port 443
User git
Preguntas
¿Por qué ssh -T git@github.com termina con un código de error?
Termina con el código 1 incluso si funciona, porque GitHub no ofrece shell. Lo que cuenta es el mensaje Hi USERNAME.
¿Puedo usar la misma clave en dos cuentas de GitHub?
No. GitHub identifica tu cuenta por la clave, y rechaza una clave ya en uso con Key already in use. Mira la guía sobre varias cuentas de GitHub.
¿Por qué Git me pide la frase de contraseña SSH en cada push?
Porque la clave no está cargada en ssh-agent. Ejecuta ssh-add ~/.ssh/id_ed25519 una vez por sesión. En Mac, ssh-add --apple-use-keychain también guarda la frase en el Llavero.
Fuentes
- Adding a new SSH key to your GitHub account, GitHub Docs
- Testing your SSH connection, GitHub Docs
- Huellas de las claves SSH de GitHub, GitHub Docs
- Usar SSH sobre el puerto HTTPS, GitHub Docs