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.

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

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 :

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

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

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

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 :

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é...) :