Ho un nuovo repository su Bitbucket. Ho generato una chiave con ssh-keygen e ho caricato la chiave pubblica su Bitbucket.
Tuttavia il comando seguente mi va in errore:
$ git pull remote master sign_and_send_pubkey: signing failed for RSA "/home/marcob/.ssh/id_rsa" from agent: agent refused operation git@bitbucket.org: Permission denied (publickey). fatal: Impossibile leggere dal repository remoto. Assicurati di disporre dei privilegi d'accesso corretti e che il repository esista.
Il problema è che, dopo aver generato la chiave, mi sono dimenticato di aggiungerla al keyring utlizzato dall’agent ssh. Quindi è necessario lanciare questo comando:
$ ssh-add Enter passphrase for /home/marcob/.ssh/id_rsa: Identity added: /home/marcob/.ssh/id_rsa (marcob@jsbach)
Alla fine si può verificare che la chiave è stata aggiunta
$ ssh-add -l 4096 SHA256:dCoHG9JO4UicfP5ct55GGTIN6U0bDzNrnUj70zbdkSc marcob@jsbach (RSA)
Sommario
Due parole sulla autenticazione a chiave pubblica SSH
Posso effettuare un’autenticazione su un server remoto con questi ingredienti:
- Un repository locale in cui risiede una coppia di chiavi RSA (generate con l’utility
ssh-keygen
) - Un agente locale (
ssh-agent
) che gestisce le coppie RSA generate in locale - Un server in cui gira un demone OpenSSH
- Un agente remoto che colloquia con l’agente locale
Inoltre, il protocollo SSH implementa l’inoltro dell’agente, un meccanismo per cui un client SSH consente a un server SSH di utilizzare l’agente ssh locale sul server a cui l’utente accede, come se fosse locale.
Quando l’utente contatta il client SSH sul server, il client tenterà di contattare l’agente implementato dal server e il server inoltra la richiesta al client che ha originariamente contattato il server, che la inoltra ulteriormente all’agente locale. In questo modo, ssh-agent e agent forwarding implementano il single sign-on che può progredire in modo transitivo.
Comunque: se oggi funziona e dopo un po’ non funziona più, è perché dev’essere riavviato l’ssh-agent.
SSH agent
ssh-agent è in sostanza un portachiavi. Un programma per contenere chiavi private usate per l’autenticazione a chiave pubblica.
Attraverso l’uso di variabili d’ambiente, l’agente può essere individuato da ssh e utilizzato automaticamente per l’autenticazione durante la registrazione in altre macchine.
L’avvio del portachiavi con inizializzazione delle variabili di ambiente viene fatta con il comando
$ eval `ssh-agent -s`
Per esempio le variabili possono assumere valori come questi:
SSH_AUTH_SOCK=/tmp/ssh-9OGf5JBFxGy6/agent.20980; export SSH_AUTH_SOCK; SSH_AGENT_PID=20981; export SSH_AGENT_PID; echo Agent pid 20981;
Qui le variabili inizializzate sono due: SSH_AUTH_SOCK e SSH_AGENT_PID.
SSH può accedere al portachiavi utilizzando queste due informazioni.
Se l’agente vi chiede nuovamente la passphrase
Vuol dire che non avete aggiunto la chiave al keyring; anzi, probabilmente non è colpa vostra: lo avete fatto ma l’accesso al portachiavi è come sempre a tempo: dopo un po’ di tempo dovete riaprirlo a mano. Potete però decidere per quanto tenerlo aperto con questo comando:
$ ssh-add -t 1h30m
per esempio così rimane aperto per un’ora e mezza. Ricordatevi comunque che è bene che il portachiavi si chiuda dopo un po’.
Comunque è sufficiente ridigitare:
$ ssh-add
Per verificare che sono state aggiunte le chiavi
$ ssh-add -l 4096 SHA256:dCoHG9JO4UicfP5ct55GGTIN6U0bDzNrnUj70zbdkSc marcob@jsbach (RSA)
Ricapitolando
Prima dell’apertura del portachiavi questa è la risposta del server Git da cui voglio scaricare gli aggiornamenti:
$ git pull origin master sign_and_send_pubkey: signing failed for RSA "/home/marcob/.ssh/id_rsa" from agent: agent refused operation git@bitbucket.org: Permission denied (publickey). fatal: Impossibile leggere dal repository remoto. Assicurati di disporre dei privilegi d'accesso corretti e che il repository esista.
Quindi riapro il portachiavi:
$ eval `ssh-agent -s` Agent pid 170012
Ora se provo a ridare il comando non avrò più l’errore ma mi verrà chesta la passphrase della mia chiave privata:
$ git pull origin master Enter passphrase for key '/home/marcob/.ssh/id_rsa':
Se voglio anche non dover ridigitare la password, aggiungo la mia chiave privata al portachiavi (devo però digitare la passphrase almeno questa volta)
$ ssh-add Enter passphrase for /home/marcob/.ssh/id_rsa: Identity added: /home/marcob/.ssh/id_rsa (marcob@jsbach)
Per le successive invocazioni con il Git server remoto non mi verrà più chiesta la password (fino allo scadere del timeout del portachiavi):
$ git pull origin master Da bitbucket.org:mxaos/logisticmapper * branch master -> FETCH_HEAD Già aggiornato.
Riferimenti SSH
- ssh.com
- ssh-agent man page
- betaingegneria – articolo successivo: Git: caricare un nuovo progetto su Bitbucket
- betaingegneria – articolo precedente: Laravel – primi passi – le rotte (routes)
Commenti recenti