Git-Commits signieren mit GPG oder SSH (GitHub & GitLab)
Christoph Schwob·2 Min. Lesezeit
Was ist neu: Fehlende Git-Konfiguration ergänzt (signingkey, gpgsign), Passphrase-Abfrage auf dem Mac und Signieren mit SSH-Schlüssel als einfachere Alternative.
Kurz & knapp
Signierte Commits bekommen bei GitHub und GitLab das Abzeichen „Verified“. Mit SSH geht es am schnellsten: git config --global gpg.format ssh, git config --global user.signingkey ~/.ssh/id_ed25519.pub und git config --global commit.gpgsign true, dann den Schlüssel im Konto als Signing Key hinterlegen. Mit GPG erstellst du den Schlüssel per gpg --full-generate-key und trägst seine ID als user.signingkey ein.
Getestet mit: Git 2.56, GnuPG 2.5, macOS 27
Name und E-Mail-Adresse eines Git-Commits kann jeder beliebig setzen – mit git config user.email bin ich in fünf Sekunden „du“. Eine Signatur beweist dagegen, dass ein Commit wirklich von dir stammt. GitHub und GitLab markieren signierte Commits mit dem Abzeichen „Verified“.
Es gibt zwei Wege: den klassischen mit GPG oder – deutlich einfacher – mit dem SSH-Schlüssel, den du für Git ohnehin schon verwendest.
Variante 1: Signieren mit SSH (empfohlen)
Seit Git 2.34 kann Git Commits mit einem SSH-Schlüssel signieren. Voraussetzung ist ein Schlüssel, z. B. ~/.ssh/id_ed25519.
-
Git auf SSH-Signaturen umstellen und den Schlüssel angeben:
git config --global gpg.format ssh git config --global user.signingkey ~/.ssh/id_ed25519.pub -
Alle Commits und Tags automatisch signieren:
git config --global commit.gpgsign true git config --global tag.gpgSign true -
Schlüssel im Konto hinterlegen: Den Inhalt von
~/.ssh/id_ed25519.pubbei GitHub unter Settings → SSH and GPG keys als Signing Key eintragen, bei GitLab unter Preferences → SSH Keys mit dem Verwendungszweck „Signing“ bzw. „Authentication & Signing“.
Variante 2: Signieren mit GPG
Für GPG brauchst du GnuPG. Die grafischen GPG-Tools (öffnet in neuem Tab) habe ich einmal ausprobiert, war mit der Oberfläche aber nicht glücklich – für Git reicht die Kommandozeilen-Variante aus Homebrew völlig:
brew install gnupg
-
Schlüssel erzeugen und die Fragen beantworten (die E-Mail-Adresse muss zu deinem GitHub- bzw. GitLab-Konto passen):
gpg --full-generate-key -
Schlüssel-ID herausfinden:
gpg --list-secret-keys --keyid-format=longsec 4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10] uid Hubot <hubot@example.com> ssb 4096R/4BB6D45482678BE3 2016-03-10Die ID steht nach dem Schrägstrich in der
sec-Zeile – hier3AA5C34371567BD2. -
Git mitteilen, welcher Schlüssel verwendet wird, und automatisches Signieren aktivieren:
git config --global user.signingkey 3AA5C34371567BD2 git config --global commit.gpgsign true git config --global tag.gpgSign true -
Öffentlichen Schlüssel exportieren
gpg --armor --export 3AA5C34371567BD2und die komplette Ausgabe (inklusive
-----BEGIN PGP PUBLIC KEY BLOCK-----) bei GitHub unter Settings → SSH and GPG keys bzw. bei GitLab unter Preferences → GPG Keys eintragen.
Passphrase-Abfrage auf dem Mac
Fragt GPG beim Commit nicht nach der Passphrase oder bricht mit einem Fehler ab, braucht GPG Zugriff auf das Terminal. Laut GitHub hilft diese Zeile in der ~/.zshrc:
export GPG_TTY=$(tty)
Bequemer ist ein grafischer Passphrase-Dialog über pinentry-mac:
brew install pinentry-mac
echo "pinentry-program $(which pinentry-mac)" >> ~/.gnupg/gpg-agent.conf
killall gpg-agent
Signatur prüfen
git log --show-signature -1
Zeigt Git hier eine gültige Signatur, aber GitHub oder GitLab trotzdem „Unverified“, liegt es fast immer an der E-Mail-Adresse: git config user.email muss einer verifizierten Adresse in deinem Konto entsprechen.
Häufige Fragen
Warum sollte ich Commits signieren?
Name und E-Mail eines Commits lassen sich beliebig setzen. Eine Signatur belegt, dass der Commit wirklich von dir stammt – GitHub und GitLab zeigen das mit „Verified“ an.
GPG oder SSH – was ist besser?
Für die meisten reicht SSH: Den Schlüssel hast du meist schon, und es ist keine zusätzliche Software nötig. GPG lohnt sich, wenn du ihn ohnehin nutzt, z. B. für E-Mail-Verschlüsselung oder Schlüssel mit Ablaufdatum.
Warum zeigt GitHub oder GitLab meinen Commit als „Unverified“?
Meist stimmt die E-Mail-Adresse im Commit (git config user.email) nicht mit einer verifizierten Adresse im Konto überein, oder der Schlüssel ist dort nicht als Signing Key hinterlegt.
Wie prüfe ich, ob ein Commit signiert ist?
Mit git log --show-signature -1 zeigt Git die Signatur des letzten Commits an.
Quellen & weiterführende Links
- Generieren eines neuen GPG-Schlüssels (öffnet in neuem Tab) – GitHub Docs
- Git über deinen Signaturschlüssel informieren (öffnet in neuem Tab) – GitHub Docs
- Sign commits with GPG (öffnet in neuem Tab) – GitLab Docs
- Sign commits with SSH keys (öffnet in neuem Tab) – GitLab Docs
Geschrieben von
Christoph Schwob (öffnet in neuem Tab)
Ich bin Christoph Schwob, halbkreativer Entwickler aus Österreich und arbeite seit über 10 Jahren an und mit TYPO3. Hier sammle ich Lösungen, Code-Snippets und Notizen rund um TYPO3, macOS, Server, Homelab und alles andere.