Git
Chapters ▾ 2nd Edition

7.4 Utilitaires Git - Signer votre travail

Signer votre travail

Git est cryptographiquement sûr, mais il n’est pas infaillible. Si vous récupérez le travail d’autres personnes sur Internet et souhaitez vérifier que les commits ont effectivement une source de confiance, Git propose quelques méthodes pour signer et vérifier ceci au moyen de GPG.

Introduction à GPG

Avant tout, si vous voulez pouvoir signer quoique ce soit, vous devez avoir un GPG configuré et une clé personnelle.

$ gpg --list-keys
/Users/schacon/.gnupg/pubring.gpg
---------------------------------
pub   2048R/0A46826A 2014-06-04
uid                  Scott Chacon (Git signing key) <schacon@gmail.com>
sub   2048R/874529A9 2014-06-04

Si vous n’avez pas de clé, vous pouvez en générer une avec la commande gpg --gen-key.

gpg --gen-key

A présent que vous avez une clé privée permettant de signer, vous pouvez configurer Git pour l’utiliser pour signer diverses choses en renseignant le paramètre de configuration user.signingkey.

git config --global user.signingkey 0A46826A

A partir de maintenant, Git utilisera par défaut votre clé pour signer les étiquettes et les commits que vous souhaitez.

Signer des étiquettes

Avec votre clé privée GPG renseignée, vous pouvez signer des étiquettes. Tout ce que vous avez à faire, c’est remplacer -a par -s :

$ git tag -s v1.5 -m 'mon étiquette signée 1.5'

You need a passphrase to unlock the secret key for
user: "Ben Straub <ben@straub.cc>"
2048-bit RSA key, ID 800430EB, created 2014-05-04

Si vous lancez git show sur cette étiquette, vous pouvez voir votre signature GPG attachée :

$ git show v1.5
tag v1.5
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:29:41 2014 -0700

mon étiquette signée 1.5
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the version number

Verifier des étiquettes

Pour vérifier une étiquette signée, vous utilisez git tag -v [nom-de-l-etiquette]. Cette commande utilise GPG pour vérifier la signature. Vous devez posséder la clé publique du signataire dans votre trousseau pour que cela fonctionne.

$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700

GIT 1.4.2.1

Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

Si vous ne possédez pas la clé publique du signataire, vous obtiendrez plutôt quelque chose comme :

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

Signer des commits

Dans les versions les plus récentes de Git (à partir de v1.7.9), vous pouvez maintenant signer aussi les commits individuels. Si signer directement des commits au lieu d’étiquettes vous intéresse, tout ce que vous avez à faire est d’ajouter l’option -S à votre commande git commit.

$ git commit -a -S -m 'commit signé'

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

[master 5c3386c] commit signé
 4 files changed, 4 insertions(+), 24 deletions(-)
 rewrite Rakefile (100%)
 create mode 100644 lib/git.rb

Pour visualiser et vérifier ces signatures, il y a l’option --show-signature pour git log.

$ git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun  4 19:49:17 2014 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) <schacon@gmail.com>"
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Jun 4 19:49:17 2014 -0700

    commit signé

En complément, vous pouvez configurer git log pour vérifier toutes les signatures qu’il trouvera et les montrer grâce au formatage %G?.

$ git log --pretty="format:%h %G? %aN  %s"

5c3386c G Scott Chacon  commit signé
ca82a6d N Scott Chacon  changed the verison number
085bb3b N Scott Chacon  removed unnecessary test code
a11bef0 N Scott Chacon  first commit

Ici nous pouvons voir que seul le dernier commit est signé et valide tandis que les précédents ne le sont pas.

Depuis Git 1.8.3, git merge et git pull peuvent vérifier et annuler une fusion d’un commit qui ne porte pas de signature GPG de confiance, avec la commande --verify-signatures.

Si vous utilisez cette option lors de la fusion d’une branche et qu’elle contient des commits qui ne sont pas signés et valides, la fusion échouera.

$ git merge --verify-signatures non-verify
fatal: La validation ab06180 n'a pas de signature GPG.

Si la fusion ne contient que des commits signés valides, la commande de fusion vous montrera toutes les signatures vérifiées et démarrera la fusion proprement dite.

$ git merge --verify-signatures signed-branch
La validation 13ad65e a une signature GPG correcte par Scott Chacon (Git signing key) <schacon@gmail.com>
Mise à jour 5c3386c..13ad65e
Avance rapide
 README | 2 ++
 1 file changed, 2 insertions(+)

Vous pouvez aussi utiliser l’option -S avec la commande git merge elle-même pour signer le commit de fusion. L’exemple suivant vérifie que tous les commits dans la branche à fusionner sont signés et de plus signe le commit de fusion résultant.

$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e a une signature GPG correcte par Scott Chacon (Git signing key) <schacon@gmail.com>

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <schacon@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

Merge made by the 'recursive' strategy.
 README | 2 ++
 1 file changed, 2 insertions(+)

Tout le monde doit signer

Signer les étiquettes et les commits, c’est bien mais si vous décidez d’utiliser cette fonction dans votre méthode de travail, il faudra s’assurer que tous les membres de votre équipe comprennent comment s’y prendre. Sinon, vous allez devoir passer du temps à aider les personnes à réécrire leurs commits en version signée. Assurez-vous de bien comprendre GPG et les bénéfices de la signature avant d’adopter cette pratique dans vos méthodes de travail.