Chapters ▾ 2nd Edition

7.4 Git-verktyg - Signera ditt arbete

Signera ditt arbete

Git är kryptografiskt säkert, men inte ofelbart. Om du hämtar arbete från andra på internet och vill verifiera att incheckningar verkligen kommer från en betrodd källa har Git flera sätt att signera och verifiera arbete med GPG.

GPG-introduktion

Först och främst behöver du konfigurera GPG och installera din personliga nyckel om du vill signera något.

$ 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

Om du inte har en nyckel installerad kan du skapa en med gpg --gen-key.

$ gpg --gen-key

När du har en privat nyckel att signera med kan du konfigurera Git att använda den för signering genom att ställa in user.signingkey i konfigurationen.

$ git config --global user.signingkey 0A46826A!

Nu kommer Git att använda din nyckel som standard för att signera taggar och incheckningar om du vill.

Signera taggar

Om du har en privat GPG-nyckel konfigurerad kan du använda den för att signera nya taggar. Allt du behöver göra är att använda -s i stället för -a:

$ git tag -s v1.5 -m 'my signed 1.5 tag'

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

Om du kör git show på den taggen kan du se din GPG-signatur kopplad till den:

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

my signed 1.5 tag
-----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

    Change version number

Verifiera taggar

För att verifiera en signerad tagg använder du git tag -v <taggnamn>. Kommandot använder GPG för att verifiera signaturen. Du behöver signerarens publika nyckel i din nyckelring för att det ska fungera korrekt:

$ 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

Om du inte har signerarens publika nyckel får du i stället något som detta:

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'

Signera incheckningar

I nyare versioner av Git (v1.7.9 och senare) kan du även signera enskilda incheckningar. Om du vill signera incheckningar direkt i stället för bara taggar behöver du bara lägga till -S i ditt git commit-kommando.

$ git commit -a -S -m 'Signed commit'

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] Signed commit
 4 files changed, 4 insertions(+), 24 deletions(-)
 rewrite Rakefile (100%)
 create mode 100644 lib/git.rb

För att se och verifiera dessa signaturer finns även flaggan --show-signature till 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

    Signed commit

Dessutom kan du konfigurera git log att kontrollera signaturer som den hittar och lista dem i sin utdata med formatet %G?.

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

5c3386c G Scott Chacon  Signed commit
ca82a6d N Scott Chacon  Change the version number
085bb3b N Scott Chacon  Remove unnecessary test code
a11bef0 N Scott Chacon  Initial commit

Här kan vi se att endast den senaste incheckningen är signerad och giltig och att de tidigare incheckningarna inte är det.

I Git 1.8.3 och senare kan git merge och git pull instrueras att granska och avvisa när de sammanfogar en incheckning som saknar en betrodd GPG-signatur genom kommandot --verify-signatures.

Om du använder det här alternativet när du sammanfogar en gren och den innehåller incheckningar som inte är signerade och giltiga kommer sammanslagningen inte att fungera.

$ git merge --verify-signatures non-verify
fatal: Commit ab06180 does not have a GPG signature.

Om sammanslagningen bara innehåller giltiga signerade incheckningar visar sammanslagningskommandot alla signaturer som kontrollerats och fortsätter sedan med sammanslagningen.

$ git merge --verify-signatures signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <schacon@gmail.com>
Updating 5c3386c..13ad65e
Fast-forward
 README | 2 ++
 1 file changed, 2 insertions(+)

Du kan också använda flaggan -S med kommandot git merge för att signera själva sammanslagningsincheckningen. Följande exempel verifierar både att varje incheckning i grenen som ska sammanfogas är signerad och signerar dessutom själva sammanslagningsincheckningen.

$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e has a good GPG signature by 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(+)

Alla måste signera

Att signera taggar och incheckningar är bra, men om du bestämmer dig för att använda detta i ditt normala arbetsflöde måste du se till att alla i teamet förstår hur man gör. Det kan uppnås genom att be alla som arbetar med kodförrådet att köra git config --local commit.gpgsign true så att alla deras incheckningar i kodförrådet signeras som standard. Om du inte gör det kommer du att lägga mycket tid på att hjälpa folk att lista ut hur de skriver om sina incheckningar till signerade versioner. Se till att du förstår GPG och fördelarna med att signera innan du gör detta till en del av ditt standardarbetsflöde.