Commits mit SSH-Keys signieren statt GPG: Einrichtung und Praxis
AI generated
git
HEAD
Git
Commit-Signierung mit SSH
Commits mit SSH-Keys signieren statt GPG

Seit Git 2.34 lässt sich ein bereits vorhandener SSH-Schlüssel direkt zum Signieren von Commits nutzen, ganz ohne separate GPG-Installation und ohne eigene Schlüsselverwaltung. Wer SSH ohnehin schon für Push und Pull einsetzt, kommt so mit deutlich weniger Aufwand zu verifizierten Commits.

9 Min. Lesezeit Git Security

1. Warum Commits überhaupt signieren

Das Autoren-Feld eines Git-Commits besteht aus reinem, unbeglaubigtem Text, Name und E-Mail-Adresse lassen sich mit git commit --author beliebig setzen, ohne dass irgendein Nachweis erbracht werden muss, dass die angegebene Person den Commit tatsächlich erstellt hat. Eine kryptografische Signatur schließt genau diese Lücke, indem sie belegt, dass ein Commit mit dem privaten Schlüssel einer bestimmten, überprüfbaren Identität erzeugt wurde.

Gerade in Projekten mit mehreren Mitwirkenden oder bei sicherheitsrelevantem Code schafft eine verifizierte Signatur zusätzliches Vertrauen bei Code-Reviews und liefert im Ernstfall einen belastbaren Nachweis, welche konkrete Person hinter einem bestimmten Commit steht. Bei einem kompromittierten Zugang, etwa wenn ein gestohlenes Zugangstoken für Push-Operationen missbraucht wird, hilft eine konsequente Signaturpflicht zusätzlich dabei, gefälschte Commits von echten zuverlässig zu unterscheiden, da ein Angreifer ohne den passenden privaten Schlüssel keine gültige Signatur erzeugen kann.

2. Warum GPG-Signierung in der Praxis oft ausgebremst wird

GPG bringt für die Commit-Signierung eine vollständig eigenständige Schlüsselverwaltung mit, inklusive Web-of-Trust-Konzept, separatem gpg-agent-Prozess und eigenem Schlüsselformat, das mit den ohnehin schon vorhandenen SSH-Schlüsseln nichts zu tun hat. Für viele Entwicklerinnen und Entwickler bedeutet das einen zusätzlichen Werkzeugstapel, der ausschließlich für diesen einen Zweck installiert und gepflegt werden muss.

In der Praxis führt genau dieser zusätzliche Aufwand häufig dazu, dass GPG-Signierung trotz vorhandener Richtlinie schlicht nicht konsequent genutzt wird, weil der gpg-agent nach einem Neustart erneut nach der Passphrase fragt, die Schlüsselerzeugung ungewohnt komplex wirkt und die Fehlermeldungen bei falscher Konfiguration selten selbsterklärend sind. Besonders auf neu eingerichteten Entwicklungsrechnern oder in containerisierten Build-Umgebungen scheitert die GPG-Einrichtung häufig schon an fehlenden Zufallsquellen für die Schlüsselerzeugung oder an einem gpg-agent, der ohne grafische Oberfläche gar nicht erst nach der Passphrase fragen kann.

3. SSH-Signaturen als Alternative seit Git 2.34

Seit Git 2.34 unterstützt Git mit gpg.format ssh ein zweites, alternatives Signaturformat, das intern auf die SSH-Signaturfunktion von OpenSSH zurückgreift, konkret auf ssh-keygen -Y sign und ssh-keygen -Y verify. Dadurch lässt sich exakt derselbe SSH-Schlüssel, der ohnehin schon für die Authentifizierung gegenüber dem Git-Server genutzt wird, unmittelbar auch zum Signieren von Commits verwenden.

Das reduziert die Einstiegshürde erheblich, da kein zusätzliches Schlüsselpaar erzeugt und keine separate Software installiert werden muss, wer bereits per SSH pusht, hat in aller Regel schon alles, was für die Signierung nötig ist.

4. Git für SSH-Signierung konfigurieren

Die Umstellung erfolgt über drei Konfigurationswerte: gpg.format wird auf ssh gesetzt, user.signingkey verweist auf den Pfad des öffentlichen SSH-Schlüssels, und commit.gpgsign aktiviert die automatische Signierung für jeden künftigen Commit, ohne dass die Option -S jedes Mal manuell angegeben werden muss. Alle drei Werte lassen sich sowohl global für alle Repositories eines Rechners als auch gezielt für ein einzelnes Projekt setzen, was sich anbietet, wenn nur bestimmte Repositories einer Signierungspflicht unterliegen sollen.

Wird zusätzlich tag.gpgsign gesetzt, gilt dieselbe automatische Signierung auch für annotierte Tags, was sich besonders für Release-Tags empfiehlt, deren Herkunft ebenfalls überprüfbar sein sollte.


# Git auf SSH-basierte Signierung umstellen
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true

5. Die allowed_signers Datei für lokale Verifikation

Damit Git eine SSH-Signatur lokal auch tatsächlich überprüfen kann, benötigt es eine Zuordnung zwischen E-Mail-Adresse und öffentlichem Schlüssel in einer sogenannten allowed_signers Datei, deren Pfad über gpg.ssh.allowedSignersFile hinterlegt wird. Jede Zeile in dieser Datei koppelt eine E-Mail-Adresse an genau einen öffentlichen Schlüssel im bekannten OpenSSH-Format.

Ohne diese Datei kann Git zwar weiterhin signieren, aber weder git log --show-signature noch git verify-commit liefern dann ein sinnvolles Ergebnis, da schlicht die Referenzinformation fehlt, welcher öffentliche Schlüssel zu welcher Identität gehört. Für ein Team empfiehlt es sich, diese Datei nicht nur lokal auf jedem einzelnen Rechner zu pflegen, sondern als zentrale, versionierte Referenz im Projekt selbst abzulegen, damit neue Mitglieder nicht erst mühsam jeden öffentlichen Schlüssel einzeln von Hand zusammensuchen müssen.


# Pfad zur allowed_signers Datei hinterlegen
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers

# Inhalt der Datei: eine Zeile pro Identität
# max@mironsoft.de ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxx...

6. Commits signieren und die Signatur prüfen

Ist commit.gpgsign aktiviert, wird jeder neue Commit ohne weiteres Zutun automatisch signiert. Ohne diese globale Einstellung lässt sich ein einzelner Commit auch gezielt mit der Option -S signieren, was sich für einen schrittweisen Einstieg anbietet, bevor die automatische Signierung für alle künftigen Commits aktiviert wird.

Zur Überprüfung liefert git log --show-signature direkt in der Log-Ausgabe an, ob und mit welchem Schlüssel ein Commit signiert wurde, während git verify-commit gezielt für einen einzelnen Commit-Hash denselben Nachweis erbringt und sich damit gut in ein automatisiertes Prüfskript einbauen lässt.


# Einzelnen Commit gezielt signieren
git commit -S -m "Feature: Preisberechnung überarbeitet"

# Signatur eines bestimmten Commits prüfen
git verify-commit HEAD

7. Unterstützung bei GitHub und GitLab

GitHub akzeptiert SSH-Signing-Keys als eigenen Schlüsseltyp, der getrennt vom regulären Authentifizierungsschlüssel in den Kontoeinstellungen hinterlegt wird, auch wenn beide technisch derselbe Schlüssel sein können. Ein erfolgreich verifizierter Commit erhält dort dasselbe grüne Verified-Abzeichen, das zuvor ausschließlich GPG-signierten Commits vorbehalten war.

GitLab unterstützt SSH-Signaturen ebenfalls, verwaltet die zugehörigen öffentlichen Schlüssel in den Benutzereinstellungen und zeigt verifizierte Commits in der Web-Oberfläche mit einem entsprechenden Hinweis an, sodass sich die Verifikation nicht nur lokal, sondern auch im Team sichtbar nachvollziehen lässt.

8. SSH- und GPG-Signierung im direkten Vergleich

Der größte praktische Unterschied liegt im Verwaltungsaufwand: SSH-Signierung nutzt die ohnehin vorhandene Schlüsselinfrastruktur, während GPG eine komplett eigenständige, parallele Verwaltung mitbringt. Beim Widerruf eines kompromittierten Schlüssels bietet GPG mit seinem Revocation-Certificate-Konzept allerdings einen etwas ausgereifteren, dedizierten Mechanismus als die SSH-Welt.

Ein klarer Vorteil von SSH-Signierung zeigt sich beim Einsatz von Hardware-Sicherheitsschlüsseln: FIDO2-Token wie ein YubiKey lassen sich über den ssh-agent direkt für die Signierung nutzen, ohne dass zusätzlich ein separates GPG-Smartcard-Setup eingerichtet werden müsste. Wer bereits einen Hardware-Token für die SSH-Authentifizierung im Einsatz hat, profitiert dadurch doppelt, da derselbe physische Schlüssel ohne zusätzliche Anschaffung auch die Signierfunktion übernimmt und der private Schlüssel dabei zu keinem Zeitpunkt den Hardware-Token verlässt.

9. Signierung im Team verbindlich einführen

Für eine verbindliche Einführung im Team empfiehlt sich, commit.gpgsign und gpg.format ssh über eine zentrale, dokumentierte Onboarding-Anleitung zu verteilen, statt sich auf die individuelle Konfiguration jeder einzelnen Entwicklerin und jedes einzelnen Entwicklers zu verlassen. Auf Server-Seite lässt sich die Pflicht zur Signierung zusätzlich über Push-Regeln oder Einstellungen für geschützte Branches technisch erzwingen.

Die allowed_signers Datei selbst kann sinnvollerweise sogar direkt im Projekt-Repository gepflegt und über einen relativen include-Pfad in der lokalen Git-Konfiguration eingebunden werden, sodass neue Team-Mitglieder automatisch die aktuelle, zentral gepflegte Liste erhalten, sobald sie das Repository klonen, ohne dass ein zusätzlicher, separater Verteilungsschritt für die eigentliche Schlüsselliste nötig wird.

Kriterium SSH-Signierung GPG-Signierung
Zusätzliche Software nötig Nein, nutzt vorhandenes OpenSSH Ja, separate GPG-Installation
Schlüssel wiederverwendbar Ja, derselbe Schlüssel wie für Push/Pull Nein, eigenes Schlüsselpaar nötig
Hardware-Token-Unterstützung Direkt über ssh-agent Nur über zusätzliches Smartcard-Setup
Widerruf eines kompromittierten Schlüssels Manuell aus allowed_signers entfernen Dediziertes Revocation-Certificate
Support bei GitHub und GitLab Ja, eigenes Verified-Abzeichen Ja, etabliert seit Jahren

Mironsoft

Git-Workflows, Branching-Strategien und CI-Hooks

Chaotische Git-Historie und unklare Branching-Regeln im Team?

Wir richten saubere Git-Workflows ein, klären Branching-Strategien fürs Team und automatisieren Qualitätschecks über Git-Hooks und CI-Pipelines, damit die Historie nachvollziehbar bleibt.

Workflow-Audit

Bestehende Branching-Strategie und Merge-Praxis auf Schwachstellen prüfen.

Hook-Automatisierung

Pre-Commit- und Pre-Push-Hooks für Linting, Tests und Commit-Konventionen einrichten.

Team-Schulung

Rebase, Cherry-Pick und Konfliktauflösung im Team praxisnah vermitteln.

10. Zusammenfassung

SSH Commit-Signierung

Kernidee

gpg.format ssh signiert Commits mit demselben SSH-Schlüssel, der ohnehin schon für Push und Pull verwendet wird.

Wichtigste Datei

Die allowed_signers Datei koppelt E-Mail-Adressen an öffentliche Schlüssel und ermöglicht lokale Verifikation.

Prüfbefehle

git log --show-signature und git verify-commit zeigen und bestätigen die Signatur eines Commits.

Plattform-Support

GitHub und GitLab zeigen SSH-signierte Commits mit demselben Verified-Abzeichen wie GPG-signierte Commits.

11. FAQ: SSH Commit-Signierung

1Ab welcher Git-Version funktioniert SSH-basierte Commit-Signierung?
Ab Git 2.34, in älteren Versionen steht ausschließlich das klassische GPG-Format für Commit-Signaturen zur Verfügung.
2Muss ich einen neuen SSH-Schlüssel erzeugen, um Commits zu signieren?
Nein, ein bereits vorhandener SSH-Schlüssel, der auch für die Authentifizierung genutzt wird, kann direkt für die Signierung eingesetzt werden.
3Was passiert, wenn die allowed_signers Datei fehlt?
Git kann weiterhin signieren, aber weder git log --show-signature noch git verify-commit liefern dann ein sinnvolles Ergebnis, da die Zuordnung von Schlüssel zu Identität fehlt.
4Erhalten SSH-signierte Commits bei GitHub dasselbe Verified-Abzeichen wie GPG-signierte?
Ja, GitHub zeigt für beide Signaturarten dasselbe grüne Verified-Abzeichen an, sofern der öffentliche Schlüssel zuvor als Signing-Key im Konto hinterlegt wurde.
5Kann ich SSH-Signierung nur für einzelne Commits statt global aktivieren?
Ja, ohne die globale Einstellung commit.gpgsign lässt sich ein einzelner Commit gezielt mit der Option -S signieren.
6Funktioniert SSH-Signierung auch mit einem Hardware-Sicherheitsschlüssel wie einem YubiKey?
Ja, über den ssh-agent lässt sich ein FIDO2-Token direkt für die Signierung nutzen, ein zusätzliches GPG-Smartcard-Setup ist dafür nicht nötig.
7Wie widerrufe ich einen kompromittierten SSH-Signing-Key?
Am einfachsten durch Entfernen des zugehörigen Eintrags aus der allowed_signers Datei und, sofern vorhanden, aus den Signing-Key-Einstellungen der genutzten Plattform.
8Lassen sich auch Tags mit SSH signieren, nicht nur Commits?
Ja, mit der zusätzlichen Einstellung tag.gpgsign werden annotierte Tags genauso automatisch signiert wie Commits.
9Unterstützt GitLab SSH-Signaturen ebenso wie GitHub?
Ja, GitLab verwaltet die öffentlichen Signing-Keys in den Benutzereinstellungen und zeigt verifizierte Commits in der Web-Oberfläche entsprechend gekennzeichnet an.
10Ist SSH-Signierung sicherer als GPG-Signierung?
Beide bieten ein vergleichbares kryptografisches Sicherheitsniveau, der praktische Unterschied liegt vor allem im geringeren Verwaltungsaufwand und der einfacheren Hardware-Token-Unterstützung bei SSH.