Η ψηφιακή υπογραφή με GPG των commits που κάνετε με το git, προσθέτουν ένα σημαντικό στοιχείο ασφάλειας και πιστοποίησης αυθεντικότητας στην συνεργασία σας σε ένα project. Ας δούμε πως μπορούμε να υπογράψουμε τα git commits με το GPG κλειδί μας.
Σε προηγούμενο άρθρο κάναμε μια εισαγωγή στην χρήση της GPG για κρυπτογράφηση και αποκρυπτογράφηση αρχείων σε Linux όπου είδαμε πως να δημιουργήσουμε τα κλειδιά μας, να τα επεξεργαστούμε, να τα μοιραστούμε αλλά και θα τα ανακαλέσουμε. Αν δεν έχετε διαβάσει την εισαγωγή αυτή, σταματήστε εδώ και διαβάστε πρώτο το άρθρο:
Σε ένα σημείο του αναφέραμε ότι τα ίδια κλειδιά μπορούν να χρησιμοποιηθούν και για ψηφιακή υπογραφή.
Τι είναι η ψηφιακή υπογραφή και που χρησιμεύει και που το χρησιμοποιώ;
Η ψηφιακή υπογραφή είναι ένα εργαλείο πιστοποίησης μεταξύ δύο μερών που ανταλλάσσουν δεδομένα εξ αποστάσεως (ομιλία, αρχεία κλπ) και χρησιμοποιείται σε μεγάλες εταιρείες αλλά και διάφορες ψηφιακές υπηρεσίες ενώ στα επόμενα χρόνια θα αρχίσει να εμφανίζεται και στην καθημερινότητα των πολιτών όταν θα συναλλάσσονται με το κράτος.
Επειδή η ψηφιακή υπογραφή είναι ένα εργαλείο που χρησιμοποιείται για την απόδειξη της γνησιότητας ενός ψηφιακού μηνύματος ή εγγράφου, δίνει στον παραλήπτη την πιστοποίηση ότι το μήνυμα (αρχείο, κέιμενο, ομιλία) που δημιουργήθηκε ανήκει στον αποστολέα που το υπέγραψε ψηφιακά και ότι δεν αλλοιώθηκε-παραποιήθηκε κατά την μεταφορά.
Επομένως μπορείτε να υπογράψετε ψηφιακά με το GPG σας, τα email σας, τα αρχεία που ανταλλάσσετε με άλλους η να το χρησιμοποιήσετε σε υπηρεσίες ανταλλαγής μηνυμάτων όπως το Keybase, το element.io κλπ.
Σήμερα θα μάθουμε πως μπορείς να χρησιμοποιήσεις ένα GPG κλειδί για να υπογράφεις τα git commits σου σε ένα GitHub / Gitlab αποθετήριο πιστοποιόντας στους άλλους ότι «εσύ πραγματικά ήσουν ο χρήστης που έστειλε τον κώδικα«. Αυτά τα υπογεγραμμένα commits σημειώνονται ως “Verified”.

Πως δημιουργούμε το GPG κλειδί μας
Επειδή έχουμε αναλύσει εκτενώς το θέμα, στο προηγούμενο άρθρο που κάναμε εισαγωγή στην χρήση της GPG θα πρέπει να έχετε διαβάσει την εισαγωγή αυτή και να έχετε δημιουργήσει τα κλειδιά σας όπως περιγράφεται εδώ:
Εδώ θα θυμίσουμε απλά ότι η εφαρμογή gpg
είναι συνήθως προεγκατεστημένη σε όλες τις διανομές Linux. Για να φτιάξετε νέα κλειδιά :
gpg --full-generate-key
- Η
--full-generate-key
επιλογή δημιουργεί τα κλειδιά διαδραστικά στο παράθυρο του τερματικού σας.

Οι επιλογές που έκανα είναι το 1 , έπειτα για μέγεθος κλειδιού το 4096, με ημερομηνία λήξης του κλειδιού σε 1y (ένα χρόνο).
Εδώ να σημειώσω ότι πρέπει να καθορίσετε πόσο καιρό θα ισχύει (ημερομηνία λήξης) το κλειδί. Εάν π.χ. μαθαίνετε τώρα το GPG, εισαγάγετε μια σύντομη διάρκεια όπως 5
, για πέντε ημέρες. Εάν πρόκειται να διατηρήσετε αυτό το κλειδί, εισαγάγετε μεγαλύτερη διάρκεια όπως 1y για ένα έτος. Το κλειδί θα ισχύει 12 μήνες και έτσι θα χρειαστεί ανανέωση μετά από ένα έτος. Αυτό προσθέτει μια επιπλέον ασφάλεια αφού και να χάσετε το κλειδί, θα ξέρετε ότι μετά από ένα χρόνο θα πρέπει να εκδώσετε νέα.
Έπειτα συμπλήρωσα το όνομά μου, το email μου (θα πρέπει να είναι το email που χρησιμοποιείτε στο github). Επίσης με βάση αυτά μπορούν να αναζητήσουν το δημόσιο κλειδί που πιστοποιεί την αυθεντικότητα των δεδομένων που στέλνω. Τέλος όρισα ένα ισχυρό συνθηματικό για την χρήση του κλειδιού. Η δημιουργία κλειδιών θα πραγματοποιηθεί και θα επιστρέψετε στη γραμμή εντολών.
Σύνδεσε το GPG κλειδί με το Git του υπολογιστή σου
Μετά την δημιουργία του GPG και την προσθήκη του στο GitHub και Gitlab λογαριασμό, ήρθε η ώρα να πούμε το Git του υπολογιστή μας πως να το χρησιμοποιεί.
Αρχικά, με την παρακάτω εντολή εμφάνισε το GPG κλειδί που μόλις δημιούργησες (με το συγκεκριμένο email):
gpg --list-secret-keys --keyid-format=long <your_email>
Αντέγραψε το ID του GPG κλειδιού σου. Στο παρακάτω παράδειγμα είναι το 83FB043D4F23F207
sec rsa4096/83FB043D4F23F207 2020-10-3 [SC]
D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
uid [ultimate] Cerebrux <your_email>
ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
Ας πούμε στο Git ποιο κλειδί να χρησιμοποιεί για να υπογράψει τα commit.
git config --global user.signingkey 83FB043D4F23F207
Σε περίπτωση που το git χρησιμοποιεί το gpg και σου εμφανίζει errors σαν αυτά:
secret key not available
gpg: signing failed: secret key not available
Χρησιμοποιείσαι την παρακάτω εντολή για να αλλάξεις το gpg σε gpg2. Αλλιώς προχώρα στο επόμενο βήμα.
git config --global gpg.program `which gpg`
Επίσης θα πούμε στο git το όνομα που είχαμε δώσει στο κλειδί μας (ποιος υπογράφει)
git config --global user.name "Salih Emin"
Αλλά και με ποιο email υπογράφει (αυτό που βάλαμε στο κλειδί μας και ταιριάζει με αυτό που χρησιμοποιώ στο Github / Gitlab)
git config --global user.email "to_email_mou@email.com"
Αυτό ήταν. Τώρα το git
ξέρει το όνομα, το email αλλά και το κλειδί με το οποίο θα υπογράφει τα commit
μας. Μπορούμε να δούμε τα global settings
του git
ποιυ χρησιμοποιούμε, με το :
cat ~/.gitconfig
[user]
email = to_email_mou@email.com
signingkey = 83FB043D4F23F207
name = Salih Emin
Πως να προσθέσουμε ένα GPG κλειδί στον Github / Gitlab λογαριασμό μας
Είτε έχετε Github λογαριασμό είτε Gitlab οι ρυθμίσεις και ο τρόπος που περιγράφουμε είναι παρόμοιος.
Πρώτα αντιγράφουμε το δημόσιο μέρος του gpg
κλειδιού που φτιάξαμε με βάση το ID του:
gpg --armor --export 83FB043D4F23F207
Αυτό θα μας εμφανίσει ένα κατεβατό που ξεκινάει με -----BEGIN PGP PUBLIC KEY BLOCK-----
και τελειώνει με -----END PGP PUBLIC KEY BLOCK-----
. Όλο αυτό το αντιγράφουμε (μαζί με τα BEGIN και END) και πάμε στον λογαριασμό μας στο Github / Gitlab:
- Στην πάνω δεξιά γωνία, επιλέγουμε το avatar μας και πηγαίνουμε στα Settings.
- Πηγαίνουμε στην επιλογή SSH and GPG keys, επιλέγουμε New GPG key και προσθέτουμε εκεί το public μέρος του GPG κλειδιού μας που αντιγράψαμε (μαζί με τα BEGIN και END) .
Υπογραφή των Commits
Εφόσον δημιουργήσαμε το GPG κλειδί, το προσθέσαμε στο λογαριασμό μας και είπαμε στο Git ποιο να χρησιμοποιεί, ήρθε η ώρα να ξεκινήσουμε να υπογράφουμε τα commits μας.
Η μόνη παράμετρος που θα χρειαστούμε στην δημιουργία commits είναι το
-S
git commit -S -m “To μήνυμα του commit"
Θα μας ζητήσει τον συνθηματικό του GPG κλειδιού μας που δώσαμε όταν το δημιουργήσαμε.
Κάθε push που κάνουμε πλέον στο Github και το Gitlab, θα δούμε οτι το commit θα είναι Verified.
Αν δεν θες να χρησιμοποιείς κάθε φορά το -S
flag, πρέπει να πούμε στο git να το κάνει αυτό αυτόματα με την παρακάτω εντολή
git config --global commit.gpgsign true
Πλέον κάθε commit που κάνετε push στο GitHub και Gitlab αποθετήριο θα είναι Verified.

Επιλέγοντας το Verified label σου δείχνει περισσότερες πληροφορίες για την υπογραφή του χρήστη που έστειλε το commit.
Αφαίρεση GPG κλειδιού
Να επισημάνω πως η αφαίρεση ενός GPG κλειδιού δεν αφαιρεί την υπογραφή στα ήδη υπογεγραμμένα commits.
Για να αφαιρέσουμε το GPG κλειδί από τον λογαριασμό μας πηγαίνουμε πάλι στα Settings και στην καρτέλα SSH and GPG keys. Και επιλέγουμε το Delete για την αφαίρεση του από τον λογαριασμό μας.
Είναι ιδιαίτερα χρήσιμη επιλογή στις περιπτώσεις που ο χρήστης για κάποιον λόγο δεν έχει πρόσβαση στο GPG κλειδί του, το έχει χάσει, έχει καταστραφεί από format ή έχει επέλθει η ημερομηνία λήξης.
Αυτόματη δημιουργία κλειδιού υπογραφή
Όταν το κάνετε αρκετές φορές, τότε ίσως να θέλετε να αυτοματοποιήσετε την διαδικασία. Για τους φίλους μας που είναι πιο έμπειροι έχουμε ένα script στο αποθετήριο λογισμικών του Cerebrux:
- Δημιουργεί κλειδί GPG αυτόματα
- Με διάρκεια 1 έτος
- Ρυθμίζει το git να χρησιμοποιεί το κλειδί
- Αντιγράφει στην προσωρινή μνήμη το δημόσιο κλειδί
- Ανοίγει το github αυτόματα για να προσθέσετε το κλειδί (πατάτε New GPG key και κάνετε επικόλληση)
Φυσικά όσοι έχετε παρακολουθήσει τα μαθήματα shell scripting μπορείτε να το επεξεργαστείτε (π.χ. να βάλετε 2 χρόνια και να ανοίγει το gitlab)
Η χρησιμότητα των ψηφιακών υπογραφών στα commit
Ίσως να αναρωτηθείτε γιατί το GitHub και Gitlab παρέχει αυτή την δυνατότητα. Είναι ένας μηχανισμός ασφαλείας που πιστοποιεί ότι ο συντάκτης του commit είναι το άτομο που σχετίζεται με αυτόν τον λογαριασμό.
Ξέρω ότι ρωτάτε: «Είναι δυνατόν να πλαστογραφήσεις μια ταυτότητα με το Git;». Η απάντηση είναι ναι. Με μια απλή εντολή μπορείτε να πλαστοπροσωπήσετε οποιονδήποτε άλλο χρήστη μέσω του GitHub:
git commit -m "Initial commit" \
--author="Linus Torvalds <torvalds@linux-foundation.org>"
έπειτα το GitHub δείχνει:

Φυσικά ο Linus Torvalds δεν συνεργάστηκε στο project μου ούτε μου έστειλε commit. Αλλά αυτός ο αδιαφανής χειρισμός ταυτότητας μπορεί ενδεχομένως να αξιοποιηθεί ως μια επίθεση κοινωνικής μηχανικής.
Για την επίλυση αυτού του προβλήματος, το Git πρόσθεσε signed commits (ψηφιακής υπογραφής), οι οποίες απεικονίζονται με την [verified] ετικέτα από το GitHub και Gitlab.
Παραπομπές:
Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα: