Signer ses commits Git
Pour beaucoup, câest peut ĂȘtre une Ă©vidence, mais jusquâĂ prĂ©sent je ne signais pas mes commits Git. Je nâen nâavais pas forcĂ©ment le besoin et la connaissance.
Alors pourquoi le faire maintenant ?
Tout simplement parce que je suis dans une sociĂ©tĂ© qui prĂ©conise de le faire đ.
Lâautre avantage est de sĂ©curiser mes commits pour ne pas avoir dâusurpation dâidentitĂ©. Câest peut ĂȘtre pas grand chose mais je me dis quâil serait dommage que cela mâarrive alors quâil est possible de sâen prĂ©munir simplement. Et avoir la double authentification (2FA pour les intimes) câest bien, mais cela nâempĂȘche pas les gens dâusurper votre identitĂ© et de mettre dans leur mĂ©ta data vos noms et emails, les commits signĂ©s oui.
Simplement, vraiment ? đ
Alors, ce nâest pas que câest compliquĂ©, câest que, pour moi, cela utilise des notions que je connais pas forcĂ©ment.
Pour le faire je vous conseille fortement les tutoriels de GitLab et GitHub.
Ces deux tutoriels vous expliquent comment créer votre clef et la configurer dans Git et votre hébergeur Git.
Les prĂ©-requis âïž
La premiĂšre chose est dâavoir un client permettant la manipulation des clefs GPG, dans mon cas, sur Mac Os, je lâinstalle avec brew:
1
$ brew install gnupg
Une fois que câest fait il suffit de suivre un des deux tutos pour crĂ©er sa clef:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gpg --generate-key
gpg (GnuPG) 2.3.6; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: Foo Bar
Email address: foo@gmail.com
You selected this USER-ID:
"Foo Bar <foo@gmail.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit?
Une fois la clef créée, il est possible dâavoir ses clefs publiques et privĂ©e:
1
2
3
4
5
6
7
8
$ gpg --list-secret-keys --keyid-format=long
/Users/sphilipp/.gnupg/pubring.kbx
----------------------------------
sec ed25519/ABCDEFGHIJKLMNOP 2022-05-05 [SC] [expires: 2024-05-04]
SSSSSSSSSSSSSSSSSSSSSSSSSABCDEFGHIJKLMNOP
uid [ultimate] Foo Bar <foo@gmail.com>
ssb cv25519/ZZZZZZZZZZZZZZZZ 2022-05-05 [E] [expires: 2024-05-04]
Ce qui est utile pour ensuite manipuler la clef est la clef publique, ABCDEFGHIJKLMNOP
dans mon exemple.
Une fois la clef gĂ©nĂ©rĂ©e vous pouvez lui ajouter un autre email, si par exemple vous avez plusieurs emails (par ex pro et perso) derriĂšre le mĂȘme compte.
Cela se passe de nouveau avec le client gpg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
& gpg --edit-key ABCDEFGHIJKLMNOP
gpg (GnuPG) 2.3.6; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2024-05-04
sec ed25519/ABCDEFGHIJKLMNOP
created: 2022-05-05 expires: 2024-05-04 usage: SC
trust: ultimate validity: ultimate
ssb cv25519/ABCDEFGHIJKLMNOP
created: 2022-05-05 expires: 2024-05-04 usage: E
[ultimate] (1). Foo Bar <foo@gmail.com>
gpg> adduid
Real name: Foo Foo
Email address: bar@gmail.com
Comment:
You selected this USER-ID:
"Foo Foo <bar@gmail.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
Pour ne pas avoir Ă saisir sa passphrase Ă chaque signature de commit il faut installer pinentry-mac
(ou pinentry pour les autres os).
Cela permet de faciliter lâenregistrement de cette passphrase dans le Keychain de Mac Os.
Ensuite, il suffit de configurer gpg pour lâutiliser.
1
2
3
$ brew install pinentry-mac
$ echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
A ce stade tout est en place pour signer ses commits.
Signer ses commits đ
LĂ câest plus simple !
Pour le faire en one shot : git commit -S -m "my cool signed commit đ"
Mais bon, on va le configurer pour le faire Ă chaque commit.
1
2
3
4
$ git config --global commit.gpgsign true
$ git config --global gpg.program gpg
$ git config --global user.signingkey ABCDEFGHIJKLMNOP
$ killall gpg-agent
Et voilĂ vos commits sont signĂ©s đ.
OĂč il est question de ceinture et de bretelles đ
Vous signez vos commits, et câest trĂšs bien mais comment savoir que, ce qui est sur GitHub et GitLab, vient bien de vous ?
Rien de plus simple, les deux portails vous proposent de rentrer votre clef publique afin de pouvoir identifier vos commits.
Pour cela il faut exporter votre clef:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ gpg --armor --export ABCDEFGHIJKLMNOP
-----BEGIN PGP PUBLIC KEY BLOCK-----
TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4g
SW4gYmliZW5kdW0gaGVuZHJlcml0IG5pYmggaWQgZ3JhdmlkYS4gUGhhc2VsbHVzIG5lYyBhbGlx
dWFtIG1hc3NhLCBmcmluZ2lsbGEgc29sbGljaXR1ZGluIG1ldHVzLiBQaGFzZWxsdXMgc2l0IGFt
ZXQgdGluY2lkdW50IG9yY2kuIERvbmVjIHF1aXMgdml2ZXJyYSBsaWd1bGEuIE5hbSBwaGFyZXRy
YSBlbGl0IGV4LCBzaXQgYW1ldCB0aW5jaWR1bnQgbmliaCB0ZW1wb3IgdmVsLiBOdWxsYSBzZW1w
ZXIgcGxhY2VyYXQgZGlhbSBzaXQgYW1ldCB2YXJpdXMuIFN1c3BlbmRpc3NlIHRyaXN0aXF1ZSBl
Z2V0IGxvcmVtIGV1IHBsYWNlcmF0LiBOdW5jIGlhY3VsaXMgbnVuYyBldCBuZXF1ZSBlZmZpY2l0
dXIgZnJpbmdpbGxhLiBWZXN0aWJ1bHVtIG1vbGxpcyBldWlzbW9kIG1hZ25hIHNpdCBhbWV0IGlu
dGVyZHVtLiBQZWxsZW50ZXNxdWUgaW1wZXJkaWV0IGxvcmVtIG51bGxhbS4g
-----END PGP PUBLIC KEY BLOCK-----
Et vous copiez cette sortie dans votre configuration GPG GitHub ou GitLab pour renseigner votre clef GPG.
Et du coup vos commits apparaissent comme verified
Et avec plusieurs ordinateurs ? đ»
Vous vous en doutez bien, si on a plusieurs ordinateurs on ne va pas gĂ©nĂ©rer des clefs diffĂ©rentes ⊠Pour cela il suffit dâexporter la clef du premier ordinateur. Puis de lâimporter sur le deuxiĂšme.
Lâexport se fait simplement avec deux commandes:
1
2
$ gpg --export-secret-keys -a ABCDEFGHIJKLMNOP > my_private_key.asc
$ gpg --export -a ABCDEFGHIJKLMNOP > my_public_key.asc
Et du coup il ne reste plus quâĂ importer les deux clefs sur le nouvel ordinateur:
1
2
$ gpg --import my_private_key.asc
$ gpg --import my_public_key.asc
Comme vous venez dâimporter une clef il vous faut indiquer le degrĂ©s de confiance que vous lui accordez (trust
), dans votre cas comme câest votre clef autant mettre le plus haut (ultimate
).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ gpg --edit-key ABCDEFGHIJKLMNOP
gpg> trust
Please decide how far you trust this user to correctly verify other users\' keys
(by looking at passports, checking fingerprints from different sources, etc.)
1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu
Go to paragraphe Signer ses commits đ
pour que les commits sur le nouvel ordinateur soit signés.
đïž Mise Ă jour de la date dâexpiration
Petite mise Ă jour de cet article en ce 4 mai 2024 ⊠car cela ne fonctionne plus đ . Avec un message qui nâest pas plus explicite que ça:
1
2
error: gpg failed to sign the data
fatal: failed to write commit object
En regardant de plus prĂšs avec la commande gpg --list-keys
, je me rends compte que mes clefs ne sont plus valides (expired
).
Si cela vous arrive il est possible dâĂ©tendre la date dâexpiration de votre clef.
1
2
3
4
5
6
7
8
9
10
11
12
13
$ gpg --edit-key ABCDEFGHIJKLMNOP
gpg> expire
Changing expiration time for the primary key.
gpg: WARNING: no user ID has been marked as primary. This command may
cause a different user ID to become the assumed primary.
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Choisissez la durée à partir de laquelle la clef ne sera plus valide puis quittez le mode édition avec save
.
Et voilĂ , votre clef est de nouveau valide đ.
Conclusion đ§
Et voilĂ , fin de cet article.
JâespĂšre quâil aura Ă©clairĂ© certain.e.s sur lâutilitĂ© (ou non) de signer ses commits et de comment faire pour la CLI git ainsi que votre portail prĂ©fĂ©rĂ©.
Merci de mâavoir lu, et si vous avez vu des coquilles nâhĂ©sitez pas Ă me lâindiquer sur lâarticle.
Comments