Categorie
Tools

Come configurare l’SSH di Git su Bitbucket

Recentemente ho scoperto Bitbucket. Per chi non lo conoscesse, si tratta di un’alternativa al più famoso GitHub.
Il vantaggio di Bitbucket è che ti permette di creare repositories privati gratuitamente (a differenza di GitHub).

Questo articolo non si pone lo scopo di spiegarti cos’è Git, nè cos’è Bitbucket (o GitHub) ne tanto meno cosa sia l’SSH. Ma dà per scontato che tu già lo sappia.
Piuttosto vuole mostrarti come utilizzare il protocollo SSH per collegare i tuoi repositories locali a quelli sul sever Bitbucket, soprattutto a chi avesse inizialmente (come me) problemi di autenticazione (Permission denied (publickey).
[box type=”note”]Utilizzare dei repositories remoti può essere un’alternativa valida anche a chi non ha necessità di condividere il proprio codice con altre persone. Pensate alla possibilità di utilizzarlo come sistema di backup… sfruttando la potenza di Git.[/box]

Introduzione

Quando utilizziamo il protocollo HTTPS per comunicare tra il sistema locale e Bitbucket è necessario eseguire l’autenticazione ogni volta che eseguiamo un’azione che comunica con il server (pull e push per esempio).
Utilizzando un’identità SSH per un repository Git, non sarà più necessario digitare la password per ogni interazione con il server Bitbucket.
Questa modalità di autenticazione è basata sul meccanismo della crittografia asimmetrica in cui avremo uno coppia di chiavi (pubblica e privata) responsabili della nostra autenticazione con il server. Da Wikipedia:

Nella fase di accesso, il client ssh prova al server di essere in possesso della chiave privata, e in caso di successo viene consentito l’accesso. In questo modo, all’utente non è richiesto di fornire la propria password ad ogni connessione

In parole povere, quello che serve a noi è un’identità SSH.
Come a avrete capito, questa sarà costituita da una chiave privata ed una pubblica. La chiave privata risiederà localmente sul nostro PC, mentre quella pubblica sarà caricata sul server all’interno del nostro account Bitbucket.
Questo ci permetterà di utilizzare il protocollo SSH per connetterci ai nostri repositories (o a quelli di altri nel caso ci abbiano consentito l’accesso).

Da tenere presente che:

  • Se si dispone di più accounts su Bitbucket non potremo utilizzare la stessa chiave pubblica, ma dovremo creare più identità SSH e caricare la corrispondente chiave pubblica su ogni account.
  • Possiamo associare più identità ad un account Bitbucket. Un esempio classico potrebbe essere la necessità di accedere al repository dal PC di casa e da quello al lavoro.

[box type=”note”]Gli esempi riportati nei prossimi paragrafi sono stati fatti in un ambiente Windows. Tuttavia funzionano perfettamente anche su sistemi Linux|Mac[/box]

Verificare l’esistenza un’identità SSH

Naturalmente potremmo già avere creato un’identità SSH sul nostro computer, tipo se abbiamo già repositories su GitHub. Possiamo controllarlo attraverso la nostra shell Git Bash, la quale è dotata di un client SSH.
Come prima cosa controlliamo di aver installato SSH avviando la shell Git Bash ed inserendo il seguente comando: (nel caso non avessimo installato SSH provvediamo a farlo)

$ ssh -v
OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007
usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_
           [-D [bind_address:]port] [-e escape_char] [-F configfil
           [-i identity_file] [-L [bind_address:]port:host:hostpor
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

Poi listiamo il contenuto della directory ssh:
Se non abbiamo identità otterremo questo risultato:

$ ls -a ~/.ssh
ls: /c/Users/my-user/.ssh: No such file or directory

altrimenti vedremo due file id:

$ ls -a ~/.ssh
id_rsa    id_rsa.pub

In questo caso abbiamo un’identità ssh di default, che corrisponde al file id_rsa.pub (rsa vuol dire che l’identità utilizza una criptografia RSA).
Possiamo scegliere di utilizzare questa identità per connetterci a Bitbucket.
[box type=”note”]Il file id_rsa.pub rappresenta la chiave pubblica mentre il file id_rsa quella privata.[/box]

Creare un’identità SSH

Nel caso non avessimo nessuna identità, per crearne una nuova avviamo il terminale Git Bash ed eseguiamo il seguente comando:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/User/my-user/.ssh/id_rsa):

Come possiamo notare di default il sistema aggiunge la chiavi di tutte le identità SSH nella directory di lavoro utente: /Users/my-user/.ssh
Diamo invio se accettiamo il percorso, oppure nel caso volessimo cambiare percorso o volessimo creare una nuova identità basta inserire il nuovo path:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/my-user/.ssh/id_rsa): /c/Users/my-user/.ssh/bitbucket_rsa

Poi ci verrà chiesto di inserire (due volte per conferma) una password, detta passphrase (possiamo anche scegliere di non inserirla… come di solito avviene, altrimenti rischiamo di perdere il vantaggio di non doverla digitare). Vediamo dunque il processo completo:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/my-user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/my-user/.ssh/id_rsa.
Your public key has been saved in /c/Users/my-user/.ssh/id_rsa.pub.
The key fingerprint is:
f9:1e:0a:f7:d4:51:8g:dd:fs:c4:14:ce:12:32:24:fa Simone@SIMONE-PC

Listiamo il contenuto ed otterremo:

$ ls ~/.ssh
id_rsa  id_rsa.pub

Le chiavi pubbliche e private sono state create!

Creare un file di configurazione

A questo punto dobbiamo creare un config file all’interno della dir ssh (~/.ssh/config).
Per farlo utilizziamo un editor di testo qualsiasi aggiungendo il seguente testo:

Host bitbucket.org
 IdentityFile ~/.ssh/id_rsa

La seconda riga deve contenere il path della chiave privata (nel nostro caso: id_rsa). Inoltre questa riga deve essere indentata con un singolo spazio (importante).
Salviamo il file e riavviamo il terminale GitBash.
[box type=”note”]Per la cronaca la mancanza di questo file era il motivo per cui avevo problemi di autenticazione. Quindi no saltate questo passaggio.[/box]

Installare la chiave pubblica su Bitbucket

Come detto la chiave pubblica deve risiedere sul server. Andiamo ad aggiungerla sul nostro account Bitbucket.
La prima cosa da fare è copiare la chiave pubblica.
La possiamo editare con il comando cat del nostro terminale:

cat ~/.ssh/id_rsa.pub

Oppure semplicemente (vedi utenti Windows) editandola con il Notepad (o altro editor).
Quindi apriamo il browser ed andiamo sul sito Bitbucket
Logghiamoci ed andiamo nella gestione del nostro account.
Clicchiamo su SSH keys.
Aggiungiamo (incollandola) la nostra chiave pubblica.
Bit Bucket Add SSH Key
Bene a questo punto, torniamo sul nostro terminale GitBash e lanciamo il seguente comando, che indica quale account Bitbucket può accedere con quella chiave:

ssh -T git@bitbucket.org

dovremmo avere una risposta tipo:

Enter passphrase for key '/c/Users/my-user/.ssh/id_rsa':
conq: logged in as my-account.

You can use git or hg to connect to Bitbucket. Shell access is disabled.

[box type=”note”]Nel mio caso, visto che ho scelto di aggiungere una passphrase mi chiede di inserirla.[/box]

Testiamo importando un repository locale

Se tutto è andato bene, siamo ora pronti per comunicare con il nostro repository.
L’URL che utilizzeremo per le nostre operazioni con il server (clone, put, push etc..) dipende dal tipo di protocollo che decideremo di utilizzare (HTTPS o SSH).

  • HTTPS: https://accountname@bitbucket.org/accountname/reponame.git
  • SSH: ssh://git@bitbucket.org/accountname/reponame.git

Chiaramente noi andremo ad utilizzare il secondo!!!
Supponiamo che abbiamo già un progetto (versionato con GIT naturalmente) e vogliamo importarlo su Bitbucket.
La prima cosa da fare è creare un nuovo repository su Bitbucket.
Poi dal nostro terminale:

$ cd /c/path/to/my/repo
$ git remote add origin ssh://git@bitbucket.org/accountname/reponame.git
$ git push -u origin --all  

Se tutto è andato liscio avremo il nostro progetto pubblicato (privatamente se lo vogliamo) su Bitbucket.
Supponiamo infine di eseguire delle modifiche alla nostra applicazione e volgiamo aggiornare il repository sul server:

echo "My README" >> README.md
git add README.md
git commit -m "Adding README"
git push -u origin master

E questo è tutto.
Ora abbiamo il nostro reporitory locale in comunicazione con quello remoto attraverso il protocollo SSH. Che ne dite? 😉

Risorse

http://it.wikipedia.org/wiki/Secure_shell
https://confluence.atlassian.com/display/BITBUCKET/Set+up+SSH+for+Git
http://www.git-scm.com/book/it/Git-sul-server-Generare-la-propria-chiave-pubblica-SSH

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.