Wer mit der Versionierungssoftware Git arbeitet und beispielsweise auf GitHub unterwegs ist, hat bestimmt schon mal das grüne Label Verified bei den Commits, oder auch Tags gesehen.
Damit wird angezeigt, dass der im Commit angegebene Autor auch wirklich derjenige ist, für den er sich ausgibt.
Theoretisch könnte man nämlich beliebigen Text in das Autor-Feld eines Commits rein schreiben.
Für diese Prüfung des Authors ist es nötig die Commits und Tags mit einem GPG (GNU Privacy Guard) Schlüssel zu signieren.
Da das Signieren erfolgt dabei mit einem privaten Schlüssel des Autors. Somit kann zusammen mit dem öffentlichen Teil des Schlüssels die Echtheit bestätigt werden.
Inhalt
- Erzeugen eines GPG-Schlüssels
- Private GPG-Schlüssel anzeigen
- Git für die Signierung konfigurieren
- Git Log mit Signaturen anzeigen
- Öffentlichen Schlüsselteil auf GitHub hinterlegen
- Mögliche Fehler und Lösungen
Erzeugen eines GPG-Schlüssels
Bevor ein Schlüssel zur Signierung verwendet werden kann, muss dieser natürlich erstellt werden.
Hierfür prüfen wir zunächst, das GPG in Version 2.1.17 oder höher installiert ist:
1 | gpg --version |
Um nun einen neuen Schlüssel zu erzeugen rufen wir gpg --full-gen-key
auf.
In den folgenden Abfragen wählen RSA und RSA
, eine Schlüssellänge von 4096
Bit und eine unbegrenzte Gültigkeit aus.
Für die User-ID werd der eigene Name und die E-Mail Adresse angegeben. Kommentar kann leer bleiben.
1 | gpg --full-gen-key |
Zum Abschluss kontrollieren wir noch mal die Eingaben und bestätigen anschließend mit F
für Fertig.
Anschließend wird nach einem Passwort für den Schlüssel gefragt. Dieses kann frei gewählt werden.
Wichtig
Dieses Passwort wird später zum Signieren benötigt.
Private GPG-Schlüssel anzeigen
Zum Anzeigen der vorhandenen privaten GPG-Schlüssel rufen wir folgendes auf:
1 | gpg --list-secret-keys --keyid-format LONG |
Unter sec
ist die ID des Schlüssels zu sehen, hier 4919811825B5C8F5
. Diese benötigen wir im Folgenden.
Git für die Signierung konfigurieren
Damit Git den Schlüssel zur Signierung nutzt, muss dies entsprechend eingerichtet werden.
Dies ist entweder global (für alle Repositories auf dem System) oder für einzelne Repositories möglich.
Wir nehmen hier die Einstellungen global vor. Für ein einzelnes Repo einfach --global
weg lassen.
1 | git config --global user.signingkey 4919811825B5C8F5 |
Damit werden der zu Nutzende Schlüssel über die ID festgelegt und die Signierung für Commits und Tags aktiviert.
Nun sollte bei jeder Erstellung eines Commits oder Tags dieser automatisch signiert werden.
Git Log mit Signaturen anzeigen
Um sich in git log
die Signaturen anzeigen zu lassen, nutzen wir den --show-signature
Parameter:
1 | git log --show-signature |
Hinweis
Auf dem System unbekannt Signaturen werden hier dann besonders hervorgehoben.
Dies heißt nur, dass die jeweilige Signatur nicht kontrolliert werden konnte, aber nicht zwangsläufig, dass etwas manipuliert wurde.
Öffentlichen Schlüsselteil auf GitHub hinterlegen
Damit nun auf GitHub die entsprechend signierten Commits auch als Verified angezeigt werden, muss im eigenen GitHub Profil noch der öffentliche Schlüsselteil hinterlegt werden.
Dazu lassen wir uns diesen zunächst anzeigen, wobei wir wieder die ID des Schlüssels benötigen:
1 | gpg --armor --export 4919811825B5C8F5 |
Diesen gesamten Schlüssel inclusive der -----BEGIN
und -----END
Zeilen kopieren wir uns.
Auf GitHub gehen wir in die Einstellungen unseres Profils und dort auf SSH and GPG keys.
Im unteren Abschnitt GPG Keys fügen wir dann über den Button New GPG key unseren öffentlichen Schlüssel hinzu.
Als Title empfehle ich hier einen aussagekräftigen Titel, über den man später direkt weiß zu welchem Rechner dieser Schlüssel gehört.
Über den Button Add GPG key wird der Schlüssel schließlich gespeichert und von nun an kann GitHub darüber verifizieren, dass unsere Commits wirklich von uns stammen. 😎
Mögliche Fehler und Lösungen
Gelegentlich (besonders beim Einsatz von WSL) kommt es dazu, dass die Signierung des Commits mit folgender Fehlermeldung fehl schlägt:
1 | error: gpg failed to sign the data |
Dies liegt oftmals daran, dass GPG nicht weiß, wo es nach dem Passwort für den Schlüssel fragen soll.
Abhilfe schafft hier dann export GPG_TTY=$(tty)
in dem Terminal aufzurufen, womit wir GPG über eine Umgebungsvariable mitteilen, was das aktuelle Terminal ist.
Damit wir dies nicht immer händisch machen müssen, können wir diesen Befehl auch der .bashrc
Datei hinzufügen, sodass er bei jedem neuen Terminal automatisch aufgerufen wird:
1 | echo 'export GPG_TTY=$(tty)' >> ~/.bashrc |
Ein weiterer Grund für diesen Fehler kann ein zu kleines Terminal sein.
Damit GPG nach dem Passwort fragen kann, muss das Terminal mindestens 12 Zeilen hoch sein. Andernfalls bricht der Vorgang mit genau dieser Fehlermeldung ab.