Στο άρθρο αυτό θα σας δείξουμε πως να σετάρετε SSH και GPG keys για χρήση με GitHub και GitLab. Θα δημιουργήσουμε από ένα SSH και από ένα GPG key ξεχωριστά για κάθε πλατφόρμα.
Η χρήση SSH keys είναι η ασφαλέστερη και προτιμητέα επιλογή προκειμένου να συνδέεστε με το GitHub /GitLab χωρίς να δίνετε κάθε φορά username/password.
Επίσης, με τα GPG keys, μπορείτε να βάζετε την ψηφιακή σας «υπογραφή» σε κάθε commit
που κάνετε σε ένα repository, πιστοποιώντας την ταυτότητά σας ως author
του συγκεκριμένου κώδικα που κάνατε commit
. Αν και δεν προσφέρει παραπάνω ασφάλεια, εντούτοις, είναι καλή πρακτική.
Φανταστείτε ένα δημοφιλές repository με ανοιχτό κώδικα όπου πολλοί χρήστες κάνουν commit
. Κάποιος πολύ εύκολα μπορεί να χρησιμοποιήσει το όνομα και το email σας στις ρυθμίσεις --author
του git. Π.χ. git commit --author="John Doe <example@example.com
και να κάνει commit κακόβουλο κώδικα προκειμένου να ξεγελάσει αυτόν ή αυτούς που θα κάνουν αποδοχή και merge τον κώδικα.
Με τη χρήση GPG key, το commit από κάποιον που δεν μπορεί να επαληθεύσει ότι είναι κάτοχος του email σας, δεν είναι ψηφιακά υπογεγραμμένο, εμφανίζεται με το badge unverified
στο GitHub/GitLab και δεν μπορεί έτσι να γίνει εύκολα merge.
Το tutorial είναι αρκετά μεγάλο, οπότε φτιάξτε έναν καφέ και ας ξεκινήσουμε. Να σημειωθεί ότι οι ρυθμίσεις γίνονται σε λειτουργικό σύστημα Linux.
Προτού Ξεκινήσουμε
Πρωτού ξεκινήσουμε, θα χρειαστούμε τα εξής:
- το
username
μας στο GitHub το οποίο μπορούμε να το βρούμε στη σελίδα https://github.com/settings/profile. - το
username
καιuser id
στο GitLab τα οποία βρίσκουμε στη διεύθυνση https://gitlab.com/-/user_settings/profile. - το
noreply
email που μας παρέχει το GitHub. Είναι της μορφής[github_username]@users.noreply.github.com
- το
noreply
email που μας παρέχει το GitLab. Είναι της μορφής[gitlab_userid]-[gitlab_username]@users.noreply.gitlab.com
Χρησιμοποιούμε τις noreply
διευθύνσεις email προκειμένου να μη φαίνεται στα commits το προσωπικό μας email. Αν επιθυμείτε βέβαια, μπορείτε να χρησιμοποιήσετε το προσωπικό ή επαγγελματικό σας email.
Για να ενεργοποιήσετε το noreply
email στο GitHub, θα πρέπει να πάτε στη διεύθυνση https://github.com/settings/emails και να κάνετε τικ στην επιλογή «Keep my email addresses private».
Στο GitLab θα πρέπει να πάτε στις ρυθμίσεις του προφίλ σας στη διεύθυνση https://gitlab.com/-/user_settings/profile και στην επιλογή «Commit email» να επιλέξετε «Use a private email …».
Ρυθμίσεις SSH
Δημιουργία SSH Keys
Ξεκινάμε δημιουργώντας ξεχωριστάssh
κλειδιά για το GitHub και το GitLab.
Θα χρησιμοποιήσουμε το ssh-keygen
και τον αλγόριθμο ed25519
για να δημιουργήσουμε τα SSH keys. Μεγάλη προσοχή να δίνετε στα password που θα χρησιμοποιήσετε. Να είναι διαφορετικά, με πολλούς χαρακτήρες και με όσο μεγαλύτερη εντροπία γίνεται.
Για το GitHub χρησιμοποιούμε στο terminal την εντολή:
1 |
ssh-keygen -t ed25519 -C "[github_username]@users.noreply.github.com" -f ~/.ssh/id_ed25519_github |
και για το GitLab την εντολή:
1 |
ssh-keygen -t ed25519 -C "[gitlab_userid]-[gitlab_username]@users.noreply.gitlab.com" -f ~/.ssh/id_ed25519_gitlab |
Πηγαίνουμε στο φάκελο ~/.ssh
και εκεί θα δούμε τα κλειδιά. Αυτά με την κατάληξη .pub
είναι τα δημόσια κλειδιά που θα καταχωρήσουμε στο GitHub και στο GibLab:
1 2 3 4 |
-rw------- 1 devblog devblog 484 Jul 8 17:11 id_ed25519_github -rw-r--r-- 1 devblog devblog 114 Jul 8 17:11 id_ed25519_github.pub -rw------- 1 devblog devblog 484 Jul 8 17:12 id_ed25519_gitlab -rw-r--r-- 1 devblog devblog 121 Jul 8 17:12 id_ed25519_gitlab.pub |
Καταχώρηση SSH Keys Σε GitHub και GitLab
Στη συνέχεια θα καταχωρήσουμε τα SSH keys σε GitHub και στη συνέχεια σε GitLab.
Πρώτα αντιγράφουμε το δημόσιο κλειδί του GitHub με τη βοήθεια του xclip
στο clipboard:
1 |
xclip -sel clip < ~/.ssh/id_ed25519_github.pub |
Έπειτα, πάμε στη διεύθυνση https://github.com/settings/keys και πατάμε το κουμπί «New SSH key». Στην επόμενη σελίδα, δίνουμε έναν τίτλο για το κλειδί στο πεδίο «Title» και κάνουμε επικόλληση στο πεδίο «Key». Τέλος πατάμε το κουμπί «Add SSH key» για να αποθηκευθεί το κλειδί.
Κάνουμε την ίδια διαδικασία στο GitLab.
Αντιγράφουμε το δημόσιο κλειδί του GitLab:
1 |
xclip -sel clip < ~/.ssh/id_ed25519_gitlab.pub |
Πάμε στη διεύθυνση https://gitlab.com/-/user_settings/ssh_keys, πατάμε το κουμπί «Add new key», δίνουμε έναν τίτλο στο πεδίο «Title», κάνουμε επικόλληση στο πεδίο «Key» και τέλος πατάμε το κουμπί «Add key».
Παραμετροποίηση SSH Config
Μέχρι στιγμής, έχουμε δημιουργήσει τα SSH keys, τα έχουμε καταχωρήσει σε GitHub και GitLab αλλά όταν κάνουμε πχ git pull
ή git push
κλπ, το git
δε γνωρίζει ποιο SSH κλειδί να χρησιμοποιήσει.
Θα πρέπει να κάνουμε κάποιες ρυθμίσεις τοπικά στο SSH προκειμένου όταν για παράδειγμα, δουλεύουμε σε ένα repository το οποίο φιλοξενείται στο GitHub και κάνουμε πχ git push
, αυτόματα να γίνει η επιλογή του SSH key για το GitHub id_ed25519_github
.
Δημιουργούμε ένα αρχείο ~/.ssh/config
με την εντολή:
1 |
touch ~/.ssh/config |
ή αν το αρχείο ήδη υπάρχει, το ανοίγουμε με:
1 |
nano ~/.ssh/config |
Βάζουμε τις παρακάτω «οδηγίες» στο αρχείο και το αποθηκεύουμε:
1 2 3 4 5 6 7 8 9 10 11 |
Host github.com Hostname github.com User git IdentityFile ~/.ssh/id_ed25519_github IdentitiesOnly yes Host gitlab.com Hostname gitlab.com User git IdentityFile ~/.ssh/id_ed25519_gitlab IdentitiesOnly yes |
Έλεγχος Σωστής Λειτουργίας SSH
Μπορούμε πλέον να ελέγξουμε αν όλα πήγαν καλά μέχρι στιγμής.
Στο terminal δίνουμε την εντολή:
1 |
ssh -T git@github.com |
Επειδή το SSH key χρησιμοποιείται για πρώτη φορά, θα εμφανιστεί κάτι σαν το ακόλουθο μήνυμα:
1 2 3 4 |
The authenticity of host 'github.com (xxx.xxx.xxx.xxx)' can't be established. ED25519 key fingerprint is SHA256:123456789999999990qwertyuiopasdfghjklzxcvbnm. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? |
Θα απαντήσουμε yes
και θα μας δώσει το μήνυμα:
1 |
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts. |
Στη συνέχεια θα μας ζητηθεί το password που δώσαμε όταν δημιουργήσαμε το κλειδί. Εφόσον όλα πήγαν καλά, θα πρέπει η εντολή να επιστρέψει το μήνυμα:
1 |
Hi [github_username]! You've successfully authenticated, but GitHub does not provide shell access. |
Ομοίως και για το GitLab, δίνουμε την εντολή:
1 |
ssh -T git@gitlab.com |
μας ζητείται το password και μετά θα πρέπει να εμφανιστεί το μήνυμα:
1 |
Welcome to GitLab, @[gitlab_username]! |
Αυτό σημαίνει ότι όταν κάναμε ssh
, με βάσει τις ρυθμίσεις στο ~/.ssh/config
, χρησιμοποιήθηκε το σωστό key για GitHub και GitLab.
Όλα πλέον είναι εντάξει με τις ρυθμίσεις για SSH και όποτε «σπρώχνουμε» κώδικα, δε θα μας ζητείται username και password, ενώ θα χρησιμοποιείται το αντίστοιχο SSH key. Πλέον μπορούμε να συνεχίσουμε με τα GPG keys!
Ρυθμίσεις GPG
Δημιουργία GPG Keys
Δημιουργούμε το πρώτο GPG key για το GitHub στο terminal με την εντολή:
1 |
gpg --full-generate-key |
Θα εμφανιστούν κάποιες ερωτήσεις σχετικά με τον τύπο του κλειδιού, το μέγεθος του κλειδιού, και τη διάρκειά του. Σε όλα πατάμε το Enter
προκειμένου να επιλεχθούν οι default τιμές.
Στη συνέχεια δίνουμε το όνομά μας και τη διεύθυνση email.
Προσέχουμε, η διεύθυνση email να είναι η [github_username]@users.noreply.github.com
ή εναλλακτικά το προσωπικό/επαγγελματικό email που έχουμε δώσει στο GitHub. Είναι η ίδια διεύθυνση email που χρησιμοποιήσαμε νωρίτερα για τη δημιουργία του SSH key.
Προσέχουμε επίσης να δώσουμε έναν κωδικό-password που θα έχει μεγάλη εντροπία.
Στο τέλος θα εμφανιστεί ένα μήνυμα επιβεβαίωσης όπως το παρακάτω:
1 2 3 4 5 6 7 8 |
gpg: key ABC123DEF456GHI789 marked as ultimately trusted gpg: revocation certificate stored as '/home/devblog/.gnupg/openpgp-revocs.d/1234567890qwertyuiop.rev' public and secret key created and signed. pub rsa3072 2024-07-08 [SC] 1234567890asdfghjklzxcvbnmqwertyuiop0987654321 uid MyName [github_username]@users.noreply.github.com> sub rsa3072 2024-07-08 [E] |
Αυτό σημαίνει ότι δημιουργήθηκε το GPG key επιτυχώς.
Συνεχίζουμε με το GPG key για το GitHub χρησιμοποιώντας την ίδια εντολή:
1 |
gpg --full-generate-key |
Πατάμε Enter
για να γίνει επιλογή των default τιμών και δίνουμε το όνομα και το email μας.
Προσέχουμε και πάλι να δώσουμε το σωστό email. Αυτό είναι το email του λογαριασμού μας στο GitHub ή καλύτερα το [gitlab_userid]-[gitlab_username]@users.noreply.gitlab.com
(ίδιο με αυτό που χρησιμοποιήσαμε κατά τη δημιουργία του SSH key για το GitHub).
Έλεγχος Κλειδιών GPG
Για να δούμε τα δύο GPG κλειδιά που μόλις δημιουργήσαμε, χρησιμοποιούμε την εντολή:
1 |
gpg --list-secret-keys --keyid-format=long |
Θα εμφανιστεί το παρακάτω μήνυμα:
1 2 3 4 5 6 7 8 9 |
sec rsa4096/AAAAAAAAAA111111 2024-07-08 [SC] [expires: 2026-07-08] 1234567890QWERTYUIOP1234567890ASDFGHJKL uid [ultimate] MyName <[github_username]@users.noreply.github.com> ssb rsa4096/1234567890ABCDE 2024-07-08 [E] [expires: 2026-07-08] sec rsa3072/BBBBBBBBBB222222 2024-07-08 [SC] [expires: 2026-07-08] 1234567890QWERTYUIOP1234567890ASDFGHJKL uid [ultimate] MyName <[gitlab_userid]-[gitlab_username]@users.noreply.gitlab.com> ssb rsa3072/1234567890ABCDE 2024-07-08 [E] [expires: 2026-07-08] |
Αυτό που είναι σημαντικό είναι το ID του κάθε GPG key το οποίο είναι το string αμέσως μετά το rsa4096/
στη γραμμή sec
, δηλαδή το AAAAAAAAAA111111
για το GitHub και το BBBBBBBBBB222222
για το GitLab.
Θα μας χρειαστούν για να κάνουμε εξαγωγή/αντιγραφή των κλειδιών προκειμένου να τα καταχωρήσουμε στις δύο πλατφόρμες.
Να σημειώσουμε ότι τα IDs των κλειδιών AAAAAAAAAA111111
και BBBBBBBBBB222222
είναι τυχαία και δίνονται μόνο ως παράδειγμα για τους σκοπούς αυτού του άρθρου.
Καταχώρηση GPG Keys Σε GitHub και GitLab
Τώρα θα προσθέσουμε τα δύο GPG keys σε GitHub και GitLab.
Πρώτα χρησιμοποιούμε την παρακάτω εντολή για την εξαγωγή του public key. Προσέχουμε να χρησιμοποιήσουμε το σωστό GPG key ID για το GitHub, δηλαδή το ΑΑΑΑΑΑΑΑΑΑ111111
:
1 |
gpg --armor --export AAAAAAAAAA111111 |
Θα εμφανιστεί το public key με την παρακάτω μορφή:
1 2 3 4 5 |
-----BEGIN PGP PUBLIC KEY BLOCK----- (το GPG key για το GitHub) -----END PGP PUBLIC KEY BLOCK----- |
Κάνουμε αντιγραφή το παραπάνω μήνυμα, πάμε στη διεύθυνση https://github.com/settings/keys και πατάμε το κουμπί «New GPG key». Δίνουμε έναν τίτλο στο πεδίο «Title», κάνουμε επικόλληση στο πεδίο «Key» και πατάμε το κουμπί «Add GPG key». Πλέον το κλειδί, έχει καταχωρηθεί στο GitHub.
Θα επαναλάβουμε την ίδια διαδικασία στο GitLab. Κάνουμε εξαγωγή το public key χρησιμοποιώντας το αντίστοιχο GPG key ID για το GitLab, δηλαδή BBBBBBBBBB222222
:
1 |
gpg --armor --export BBBBBBBBBB222222 |
Θα εμφανιστεί το public key με την παρακάτω μορφή:
1 2 3 4 5 |
-----BEGIN PGP PUBLIC KEY BLOCK----- (το GPG key για το GitLab) -----END PGP PUBLIC KEY BLOCK----- |
Κάνουμε αντιγραφή το παραπάνω μήνυμα, πάμε στη διεύθυνση https://gitlab.com/-/user_settings/gpg_keys, και πατάμε το κουμπί «Add new key». Κάνουμε επικόλληση στο πεδίο «Key» και πατάμε το κουμπί «Add key». Πλέον το κλειδί, έχει καταχωρηθεί στο GitLab.
Παραμετροποίηση Git Config Για Χρήση GPG Keys
Θα χρειαστεί τώρα να κάνουμε κάποιες αλλαγές στις τοπικές ρυθμίσεις του git
προκειμένου όταν κάνουμε commit
σε GitHub repository να χρησιμοποιεί το GPG key του GitHub, και αντίστοιχα για commits σε repositories που φιλοξενούνται στο GitLab, το key του GitLab.
Δημιουργούμε τα εξής 2 αρχεία:
- ~/.gitconfig_github
- ~/.gitconfig_gitlab
Ανοίγουμε το αρχείο ~/.gitconfig_github
με nano ~/.gitconfig_github
(ή τον editor της επιλογής μας) και προσθέτουμε το παρακάτω:
1 2 3 4 5 6 |
[user] email = [github_username]@users.noreply.github.com signingkey = AAAAAAAAAA111111 [commit] gpgsign = true |
και στο ~/.gitconfig_gitlab
βάζουμε τα εξής:
1 2 3 4 5 6 |
[user] email = [gitlab_userid]-[gitlab_username]@users.noreply.gitlab.com signingkey = BBBBBBBBBB222222 [commit] gpgsign = true |
Προσέχουμε ότι σε κάθε αρχείο, χρησιμοποιούμε το GPG key ID και το αντίστοιχο email που χρησιμοποιήσαμε όταν το δημιουργήσαμε. Δηλαδή, το GPG key ID του GitHub μαζί με το email του GitHub, και το αντίστοιχο key ID του GitLab μαζί με το email του GitLab.
Ανοίγουμε το αρχείο ~/.gitconfig
:
1 |
nano ~/.gitconfig |
και βάζουμε τις ακόλουθες «οδηγίες»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[user] name = MyName [includeIf "hasconfig:remote.*.url:git@github.com:**/**"] path = ~/.gitconfig_github [includeIf "hasconfig:remote.*.url:https://github.com/**/**"] path = ~/.gitconfig_github [includeIf "hasconfig:remote.*.url:git@gitlab.com:**/**"] path = ~/.gitconfig_gitlab [includeIf "hasconfig:remote.*.url:https://gitlab.com/**/**"] path = ~/.gitconfig_gitlab |
Με λίγα λόγια, δώσαμε «οδηγίες» στο Git, όταν το git remote
URL περιέχει github.com
τότε θα χρησιμοποιηθεί το αρχείο ~/.gitconfig_github
και αν το remote
URL περιέχει το gitlab.com
θα χρησιμοποιηθεί το αρχείο ~/.gitconfig_gitlab
.
ΠΡΟΣΟΧΗ!!! Η οδηγία-συνθήκη [includeIf <condition>]
δουλεύει μόνο σε εκδόσεις Git ανώτερες του 2.36
. Ελέγξτε την έκδοσή σας με git --version
και κάντε αναβάθμιση αν χρειαστεί.
Τελικός Έλεγχος SSH και GPG Κλειδιών
Προκειμένου να ελέγξετε ότι όλα πήγαν καλά, δημιουργήστε ένα νέο – κενό repository στο GitHub και άλλο ένα στο GitLab. Δημιουργήστε αντίστοιχα στον υπολογιστή σας 2 μικρά απλά git
projects με ένα άδειο README.md
αρχείο μόνο. Κάντε τα commit
και push
.
Εκτός απροόπτου, ο κώδικας θα ανέβει στα 2 repositories χωρίς να σας ζητηθεί να δώσετε username/password. Έχει γίνει σωστά η χρήση των δύο SSH κλειδιών που δημιουργήσαμε!
Στη συνέχεια, πηγαίνετε στις σελίδες των repositories στο GitHub και GitLab, όπου θα δείτε το αρχείο README.md
, και μετά ελέγξτε τα commits
.
Θα δείτε ότι και τα 2 commits σε GitHub και GitLab έχουν ένα badge που λέει «Verified» όπως το παρακάτω:
Χωρίς τη χρήση GPG key για την υπογραφή του commit, θα εμφανιζόταν ως εξής:
Έχει γίνει δηλαδή σωστή χρήση των GPG κλειδιών που δημιουργήσαμε για την «υπογραφή» των commits!
Σημείωση: Προκειμένου να ενεργοποιήσετε τα Verified/Unverified badges στο GitHub, πηγαίνετε στη σελίδα https://github.com/settings/keys και στις ρυθμίσεις για «Vigilant mode», κάνετε τικ στην επιλογή «Flag unsigned commits as unverified». Για το GitLab δε χρειάζετε να κάνετε κάτι στις ρυθμίσεις. Βάζει το Verified badge όταν δει ότι είναι «signed» το commit.
Αν έχετε κάποιες απορίες ή παρατηρήσεις για το άρθρο, παρακαλώ γράψτε μας στα σχόλια.