-- Leo's gemini proxy

-- Connecting to thasmanie.fr:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=fr

Signer ses commits git avec pgp

2021-11-27

retour


Intro

Il est possible de renforcer un peu la sécurité d'un projet git en demandant aux contributeurs de signer leurs commits git. On peut le faire avec gpg (= gnupg, l'implémentation du standard pgp).

Et tant qu'à faire, on va aussi voir comment s'authentifier au repo git distant via https et un token, le tout stocké dans un fichier chiffré avec gpg aussi.


Je donne les principes généraux, et des liens avec les docs et exemples détaillés.


Signer ses commits

Il faut générer une clé pgp, puis la configurer dans git.


$ gpg --full-generate-key
$ gpg --list-secret-keys --keyid-format LONG <your_email>

on récupère ce qui est après `sec rsa4096/` (par exemple)


$ git config --global user.signingkey <id qu'on vient de récup>
$ git config --global commit.gpgsign true

Ensuite il ne reste qu'à l'ajouter à son compte via l'interface web (gitea, gitlab, github, ...).

On aura alors de beaux encadrés verts "Verified" qui apparaissent.


La doc de gitlab est bien faite.


https://docs.gitlab.com/ee/user/project/repository/gpg_signed_commits/


S'authentifier avec .netrc.gpg

Si on utilise https plutôt que ssh pour la branche remote d'un repo git, on peut stocker ses identifiants (son Personal access token de gitlab par exemple) dans ~/.netrc, et pour éviter que ce dernier soit en clair sur le disque, on peut le chiffrer.


Attention, tous les programmes qui utilisent .netrc ne sont pas compatibles avec ce chiffrement pgp.


Ce fichier se présente comme ceci :

$ cat ~/.netrc
machine git.toto.fr
login monuser
password tokenOuMotDePasseEnClair
protocol https

On va donc le chiffrer (on peut utiliser sa clé créée plus ci-dessus) :


$ gpg --encrypt --recipient thasos@thasmanie.fr ~/.netrc

On peut maintenant supprimer l'ancien (sauf si vous l'utilisez pour d'autres programmes !) :

$ rm ~/.netrc
$ ls -l ~/.netrc*
-rw-r--r-- 1 thasos thasos 559 27 nov.  20:24 /home/thasos/.netrc.gpg

On va maintenant configurer git et installer le helper dédié (car hélas pas installé de base) :


$ git clone https://github.com/git/git.git
$ cd git/contrib/credential/netrc
$ make
$ sudo cp git-credential-netrc /usr/local/bin
$ git config --global credential.helper netrc

Et voilà, maintenant on voit un beau message "gpg: chiffré avec une clef..." à chaque pull, push etc… et on ne rentre son mot de passe que pour charger la clé pgp.


Si on a une erreur "Inappropriate ioctl for device" (ou "Ioctl() inapproprié pour un périphérique"), il suffit d'ajouter une variable d'env :


echo "export GPG_TTY=$(tty)" >> ~/.bashrc

La doc qui m'a tout appris :

https://andrearichiardi.com/blog/posts/git-credential-netrc.html


Bonus : temps de session gpg


Si on veut configurer la durée du timeout pour entrer le mot de passe de la clé pgp (quand je lis la doc, je pense qu'il faut les 2, mais j'ai pas testé...) :


cat ~/.gnupg/gpg-agent.conf
default-cache-ttl 14400
max-cache-ttl 14400

-- Response ended

-- Page fetched on Sun May 5 15:13:03 2024