Nachdem ich nun schon länger mit git arbeite, wollte ich meine Commits mal signieren. Wenn es geht, warum nicht, oder? Immerhin könnte schließlich jeder mit meiner Mailadresse einen Commit ausführen und dann mit dem eigenen SSH-Key pushen. Damit das nicht mehr geht, und auch andere meinen Commits vertrauen können, signiere ich diese nun entsprechend mit GPG-Keys.
Dazu habe ich als erstes gpg mit Hilfe von Brew auf meinem Mac installiert:
brew install gpg
Solltet ihr nicht sicher sein, ob GPG installiert ist, könnt ihr einfach mit diesem Schritt prüfen ob alles da ist. So listet ihr die entsprechenden Keys auf:
gpg --list-secret-keys --keyid-format LONG
Beim ersten Aufruf bekommt man dann folgende Meldung.
gpg: Verzeichnis `/Users/matthiaskleine/.gnupg' erzeugt gpg: Die "Keybox" `/Users/matthiaskleine/.gnupg/pubring.kbx' wurde erstellt gpg: /Users/matthiaskleine/.gnupg/trustdb.gpg: trust-db erzeugt
Dort liegen dann eben die Datenbanken, welche die Keys halten. Sollte diese leer sein, muss ein neuer Schlüssel angelegt werden:
gpg --gen-key
Im Prozess werdet ihr dann nach Vorname, Name, Email und einem Passwort für die Datenbank gefragt. Dieses Passwort solltet ihr Euch unbedingt irgendwo speichern. Ich nutze dafür (wie immer) 1Password. Für mich das beste Tool auf dem Markt wenn es darum geht Passwörter zu verwalten.
Die Ausgabe sieht dann in etwa so aus:
gpg (GnuPG) 2.1.22; Copyright (C) 2017 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Hinweis: "gpg2 --full-generate-key" ruft den erweiterten Dialog auf. GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen. Ihr Name ("Vorname Nachname"): Matthias Kleine Email-Adresse: matthias@blabla.de Sie haben diese User-ID gewählt: "Matthias Kleine <matthias@blabla.de>" "Ändern: (N)ame, (E)-Mail oder (F)ertig/(A)bbrechen? "Ändern: (N)ame, (E)-Mail oder (F)ertig/(A)bbrechen? F Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. gpg: Schlüssel 1234567890ABCDEF ist als ultimativ vertrauenswürdig gekennzeichnet gpg: Verzeichnis `/Users/matthiaskleine/.gnupg/openpgp-revocs.d' erzeugt gpg: Widerrufzertifikat wurde als '/Users/matthiaskleine/.gnupg/openpgp-revocs.d/EA1234567896C5DED30023FB18A88489ABCDEF01.rev' gespeichert. "Öffentlichen und geheimen Schlüssel erzeugt und signiert. pub rsa2048 2017-08-07 [SC] [verfällt: 2019-08-07] EA1234567896C5DED30023FB18A88489ABCDEF01 uid Matthias Kleine <matthias@blabla.de> sub rsa2048 2017-08-07 [E] [verf"allt: 2019-08-07]
Jetzt können wir die entsprechenden (neuen) Schlüssel noch einmal auslesen:
gpg --list-secret-keys --keyid-format LONG
gpg: "Trust-DB" wird überprüft gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: Tiefe: 0 gültig: 1 signiert: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 1u gpg: nächste "Trust-DB"-Pflicht"uberprüfung am 2019-08-07 /Users/matthiaskleine/.gnupg/pubring.kbx ---------------------------------------- sec rsa2048/1234567890ABCDEF 2017-08-07 [SC] [verf"allt: 2019-08-07] EA1234567896C5DED30023FB18A88489ABCDEF01 uid [ ultimativ ] Matthias Kleine <matthias@klein0r.de> ssb rsa2048/1234567890ABCDEF 2017-08-07 [E] [verf"allt: 2019-08-07]
Wir brauchen hieraus den Teil hinter sec rsa2048/. Also in meinem Fall 1234567890ABCDEF.
Diesen exportieren wir nun, um ihn auf GitHub zu hinterlegen:
gpg --armor --export 1234567890ABCDEF
Diese Ausgabe fügen wir (inklusive —–BEGIN PGP PUBLIC KEY BLOCK—– und Ende) komplett auf GitHub im Profil als neuen GPG-Key ein. Danach sollte das Ganze so aussehen:
Jetzt müssen wir git nur noch erklären, dass es diesen Key gibt und dass dieser bitte auch verwendet werden soll, um die einzelnen Commits zu signieren.
git config --global user.signingkey 1234567890ABCDEF
Theoretisch müsste man nun bei jedem commit -S anhängen, damit der entsprechende Commit auch signiert wird. Das macht natürlich wenig Spaß.
git commit -S -m "your commit message"
Damit man sich das sparen kann, würde ich in die .gitconfig eine Einstellung aufnehmen, welche direkt dafür sorgt, dass alle commits automatisch und immer signiert werden:
git config --global commit.gpgsign true
Jetzt musste ich in meinem Fall noch folgende Zeile in meine ~/.bash_profile aufnehmen, damit das Ganze von Bash aus läuft:
export GPG_TTY=$(tty)
Zusätzlich habe die folgende Datei mit dem nachfolgenden Inhalt angelegt: ~/.gnupg/gpg.conf
no-tty use-agent
Leider unterstützt z.B. PHPStorm das ganze Signing noch nicht (und fragt daher nicht nach dem entsprechenden Passwort für den GPGKey. Bei mir klappte es aber, nachdem ich den ersten Commit auf der Bash gemacht habe und das Passwort eingegeben habe, PHPStorm neugestartet hatte und dann erst einen commit über die Oberfläche ausgeführt habe. Vorher hatte ich immer dieser Meldung bekommen:
Fertig! Ab jetzt werden alle Commits entsprechend signiert. Dass ein Commit auf GitHub signiert wurde erkennt man am „Verified“ Badge: