Kapitel ▾ 2. Auflage

7.4 Git-Tools - Ihre Arbeit signieren

Ihre Arbeit signieren

Git ist kryptografisch sicher, aber nicht unfehlbar. Wenn Sie Arbeit von anderen im Internet übernehmen und überprüfen möchten, ob Commits tatsächlich von einer vertrauenswürdigen Quelle stammen, bietet Git verschiedene Möglichkeiten, Ihre Arbeit mit GPG zu signieren und zu überprüfen.

GPG-Einführung

Zunächst müssen Sie GPG konfigurieren und Ihren persönlichen Schlüssel installieren, wenn Sie etwas signieren möchten.

$ 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

Wenn Sie keinen Schlüssel installiert haben, können Sie einen mit gpg --gen-key generieren.

$ gpg --gen-key

Sobald Sie einen privaten Schlüssel zum Signieren haben, können Sie Git so konfigurieren, dass es diesen zum Signieren von Dingen verwendet, indem Sie die Konfigurationseinstellung user.signingkey setzen.

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

Jetzt verwendet Git standardmäßig Ihren Schlüssel, um Tags und Commits zu signieren, wenn Sie dies wünschen.

Tags signieren

Wenn Sie einen GPG-Privatschlüssel eingerichtet haben, können Sie ihn nun zum Signieren neuer Tags verwenden. Alles, was Sie tun müssen, ist -s anstelle von -a zu verwenden.

$ 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

Wenn Sie git show für diesen Tag ausführen, sehen Sie Ihre GPG-Signatur daran angehängt.

$ 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

Tags überprüfen

Um einen signierten Tag zu überprüfen, verwenden Sie git tag -v <tag-name>. Dieser Befehl verwendet GPG, um die Signatur zu überprüfen. Sie benötigen den öffentlichen Schlüssel des Unterzeichners in Ihrem Schlüsselbund, damit dies ordnungsgemäß funktioniert.

$ 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

Wenn Sie den öffentlichen Schlüssel des Unterzeichners nicht haben, erhalten Sie stattdessen etwas wie dies.

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'

Commits signieren

In neueren Git-Versionen (v1.7.9 und höher) können Sie jetzt auch einzelne Commits signieren. Wenn Sie daran interessiert sind, Commits direkt anstelle von nur Tags zu signieren, müssen Sie lediglich -S zu Ihrem git commit-Befehl hinzufügen.

$ 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

Um diese Signaturen anzuzeigen und zu überprüfen, gibt es auch die Option --show-signature für 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

Zusätzlich können Sie git log konfigurieren, um gefundene Signaturen zu überprüfen und sie in seiner Ausgabe mit dem Format %G? aufzulisten.

$ 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

Hier sehen wir, dass nur der neueste Commit signiert und gültig ist und die vorherigen Commits nicht.

In Git 1.8.3 und höher können git merge und git pull angewiesen werden, beim Mergen eines Commits, der keine vertrauenswürdige GPG-Signatur trägt, zu prüfen und abzulehnen, mit dem Befehl --verify-signatures.

Wenn Sie diese Option beim Mergen eines Branches verwenden und dieser Commits enthält, die nicht signiert und gültig sind, funktioniert der Merge nicht.

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

Wenn der Merge nur gültig signierte Commits enthält, zeigt der Merge-Befehl alle geprüften Signaturen an und fährt dann mit dem Merge fort.

$ 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(+)

Sie können auch die Option -S mit dem Befehl git merge verwenden, um den resultierenden Merge-Commit selbst zu signieren. Das folgende Beispiel überprüft sowohl, ob jeder Commit im zu mergenden Branch signiert ist, als auch signiert den resultierenden Merge-Commit.

$ 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(+)

Jeder muss unterschreiben

Das Signieren von Tags und Commits ist großartig, aber wenn Sie sich entscheiden, dies in Ihrem normalen Workflow zu verwenden, müssen Sie sicherstellen, dass jeder in Ihrem Team versteht, wie das geht. Dies kann erreicht werden, indem Sie jeden, der mit dem Repository arbeitet, bitten, git config --local commit.gpgsign true auszuführen, um alle seine Commits im Repository standardmäßig signieren zu lassen. Andernfalls werden Sie viel Zeit damit verbringen, Leuten zu helfen, ihre Commits mit signierten Versionen neu zu schreiben. Stellen Sie sicher, dass Sie GPG und die Vorteile des Signierens von Dingen verstehen, bevor Sie dies als Teil Ihres Standard-Workflows einführen.