Zum Inhalt springen

~/CodeBlog.at

Git-Commits signieren mit GPG oder SSH (GitHub & GitLab)

·2 Min. Lesezeit

Veröffentlicht
Überarbeitet

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

Inhalt
  1. Variante 1: Signieren mit SSH (empfohlen)
  2. Variante 2: Signieren mit GPG
  3. Passphrase-Abfrage auf dem Mac
  4. Signatur prüfen

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.

  1. 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
  2. Alle Commits und Tags automatisch signieren:

    git config --global commit.gpgsign true
    git config --global tag.gpgSign true
  3. Schlüssel im Konto hinterlegen: Den Inhalt von ~/.ssh/id_ed25519.pub bei 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
  1. Schlüssel erzeugen und die Fragen beantworten (die E-Mail-Adresse muss zu deinem GitHub- bzw. GitLab-Konto passen):

    gpg --full-generate-key
  2. Schlüssel-ID herausfinden:

    gpg --list-secret-keys --keyid-format=long
    sec   4096R/3AA5C34371567BD2 2016-03-10 [expires: 2017-03-10]
    uid                          Hubot <hubot@example.com>
    ssb   4096R/4BB6D45482678BE3 2016-03-10

    Die ID steht nach dem Schrägstrich in der sec-Zeile – hier 3AA5C34371567BD2.

  3. 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
  4. Öffentlichen Schlüssel exportieren

    gpg --armor --export 3AA5C34371567BD2

    und 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

  1. Generieren eines neuen GPG-Schlüssels (öffnet in neuem Tab) – GitHub Docs
  2. Git über deinen Signaturschlüssel informieren (öffnet in neuem Tab) – GitHub Docs
  3. Sign commits with GPG (öffnet in neuem Tab) – GitLab Docs
  4. 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.

Suche

Tippe einen Suchbegriff ein.