Genera una chiave
Salta questo passaggio se ne hai già una, cosa che vedi con ls ~/.ssh/*.pub.
ssh-keygen -t ed25519 -C "you@example.com"
Accetta il file predefinito e imposta una passphrase. Su Windows, vedi generare una chiave su Windows.
Non sai che tipo scegliere? Vedi chiavi SSH RSA o ed25519.
Copia la chiave pubblica
pbcopy < ~/.ssh/id_ed25519.pub # macOS
cat ~/.ssh/id_ed25519.pub # Linux: copy the output by hand
Su Windows usa Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard. È una sola riga che inizia con ssh-ed25519. Se quello che hai inizia con -----BEGIN, è la chiave privata, quindi fermati e non incollarla da nessuna parte.
Aggiungila su GitHub
- Clicca la tua immagine del profilo in alto a destra, poi Settings.
- Nella sezione Access della barra laterale, clicca SSH and GPG keys.
- Clicca New SSH key.
- Dagli un titolo che indichi la macchina, come "Personal laptop".
- Scegli il tipo di chiave Authentication. Signing è un uso separato: per firmare i commit con la stessa chiave, caricala una seconda volta come Signing.
- Incolla la chiave senza aggiungere interruzioni di riga e clicca Add SSH key.
Con lo strumento a riga di comando di GitHub, dopo gh auth login:
gh ssh-key add ~/.ssh/id_ed25519.pub --title "Personal laptop"
GitHub non accetta più le chiavi DSA. Se un'organizzazione di cui fai parte usa il single sign-on SAML, potresti dover autorizzare la chiave anche per quella, nella stessa pagina.
Provala e controlla il fingerprint
ssh -T git@github.com
La prima volta, ssh chiede se fidarsi dell'host. Confronta ciò che mostra con l'elenco che pubblica GitHub. Abbiamo verificato che questi valori corrispondono a ciò che invia github.com:
| Tipo | Fingerprint SHA256 |
|---|---|
| Ed25519 | SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU |
| ECDSA | SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM |
| RSA | SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s |
GitHub può cambiarli, quindi il riferimento è la sua pagina. Un login riuscito stampa:
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
Se ottieni invece un errore, vedi git@github.com: Permission denied (publickey).
Perché ssh chiede conferma la prima volta, e come leggere la domanda: known_hosts e fingerprint dell'host spiegati.
Fai usare SSH al tuo repository
Una chiave non serve a nulla per un repository clonato via HTTPS. Controlla, e se serve cambia:
git remote -v
git remote set-url origin git@github.com:OWNER/REPO.git
Per un nuovo clone, usa la stessa forma di indirizzo:
git clone git@github.com:OWNER/REPO.git
Se Git chiede la passphrase o usa la chiave sbagliata
Carica la chiave in ssh-agent una volta per sessione con ssh-add ~/.ssh/id_ed25519. Su Mac il Portachiavi può conservare la passphrase anche dopo un riavvio: vedi ssh-agent e il Portachiavi di macOS.
Se la tua chiave ha un altro nome, indica a ssh quale usare per GitHub in ~/.ssh/config:
Host github.com
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
Per un secondo account GitHub sullo stesso computer, vedi più account GitHub con SSH.
Se la porta 22 è bloccata
Alcune reti la bloccano, e si vede come un timeout. GitHub accetta SSH anche sulla porta 443:
ssh -T -p 443 git@ssh.github.com
Se funziona, rendilo permanente in ~/.ssh/config:
Host github.com
Hostname ssh.github.com
Port 443
User git
Domande
Perché ssh -T git@github.com esce con un codice di errore?
Esce con il codice 1 anche in caso di successo, perché GitHub non fornisce una shell. Conta il messaggio Hi USERNAME.
Posso usare la stessa chiave su due account GitHub?
No. GitHub identifica il tuo account dalla chiave e rifiuta una chiave già in uso con Key already in use. Vedi la guida sugli account GitHub multipli.
Perché Git mi chiede la passphrase della chiave SSH a ogni push?
Perché la chiave non è caricata in ssh-agent. Esegui ssh-add ~/.ssh/id_ed25519 una volta per sessione. Su Mac, ssh-add --apple-use-keychain salva anche la passphrase nel Portachiavi.
Fonti
- Adding a new SSH key to your GitHub account, GitHub Docs
- Testing your SSH connection, GitHub Docs
- GitHub's SSH key fingerprints, GitHub Docs
- Using SSH over the HTTPS port, GitHub Docs