devAlice
← Windows

Git-Authentifizierung unter Windows — Credential Manager · SSH · Commit-Signierung

Reibungslose Git-Authentifizierung unter Windows: Git Credential Manager, SSH-Schlüssel, SSH-Signierung, Multi-Account.

Git-Authentifizierung unter Windows ist etwas kniffliger als unter macOS/Linux — Git Credential Manager (GCM), OpenSSH und der 1Password-Agent können kollidieren. Dieser Leitfaden beschreibt eine einmalige, saubere Einrichtung, die man ein Jahr lang nicht anfassen muss.

Zielgruppe: Windows 11 + Git for Windows + GitHub (nach der Windows-Ersteinrichtung).

TL;DR

  1. Git Credential Manager (GCM) — OAuth (Browser-Anmeldung) für HTTPS-Klone
  2. OpenSSH-Schlüssel — für SSH-Klone. Ed25519 empfohlen
  3. Commit-Signierung — via SSH-Schlüssel (einfacher als GPG)
  4. Arbeit/Privat trennenInclude.path oder ~/.ssh/config-Host-Aliasse
  5. 1Password SSH-Agent (optional) — Schlüssel im Vault

Voraussetzungen

  • Git for Windows 2.40+ — winget install --id Git.Git (Windows-Ersteinrichtung)
  • OpenSSH-Client aktiviert (Standard unter Win11) — prüfen mit Get-WindowsCapability -Online -Name "OpenSSH.Client*"

1. Git Credential Manager — HTTPS

GCM ist in Git for Windows enthalten. HTTPS-Klone/-Pushes öffnen automatisch den OAuth-Browser-Flow:

git clone https://github.com/user/repo.git
# Browser öffnet sich → GitHub-Anmeldung → Token wird automatisch gespeichert

Speicherort: Windows Credential Manager (Systemsteuerung → Benutzerkonten → Credential Manager → Windows-Anmeldeinformationen).

Prüfen

git config --global credential.helper
# manager

Bei manager ist GCM aktiv. Andernfalls:

git config --global credential.helper manager

Multi-Account (Arbeit + privates GitHub)

Unterschiedliche Helper pro URL:

git config --global --add credential.https://github.com.useHttpPath true

Jetzt gibt es separate Anmeldedaten pro Pfad auf demselben Host.

2. SSH-Schlüssel

SSH ist reibungsloser als HTTPS (kein Browser). Einen Ed25519-Schlüssel generieren:

ssh-keygen -t ed25519 -C "you@example.com"
# Pfad: ~/.ssh/id_ed25519 (Standard)
# Passphrase: empfohlen (1Password-Agent entsperrt automatisch)

Den öffentlichen Schlüssel anzeigen:

Get-Content ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAA... you@example.com

GitHub → Einstellungen → SSH- und GPG-Schlüssel → Neuer SSH-Schlüssel → öffentlichen Schlüssel einfügen.

ssh-agent aktivieren (Passphrase automatisch entsperren)

# Administrator-PowerShell
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
 
# Normale PowerShell
ssh-add ~/.ssh/id_ed25519
# Passphrase einmal eingeben; danach automatisch

SSH prüfen

ssh -T git@github.com
# Hi yourname! You've successfully authenticated, but GitHub does not provide shell access.

Remote-URL wechseln (HTTPS → SSH)

git remote set-url origin git@github.com:user/repo.git

3. Commit-Signierung mit SSH

Einfacher als GPG und verwendet denselben Schlüssel wieder. Erfordert Git 2.34+.

git config --global gpg.format ssh
git config --global user.signingkey "ssh-ed25519 AAAA... you@example.com"
git config --global commit.gpgsign true
git config --global tag.gpgsign true

user.signingkey ist die vollständige Zeile des öffentlichen Schlüssels. Oder ein Dateiverweis:

git config --global user.signingkey "C:/Users/me/.ssh/id_ed25519.pub"

Den Signierschlüssel bei GitHub registrieren

Denselben öffentlichen Schlüssel auf GitHub registrieren → SSH- und GPG-Schlüssel → Neuen SSH-Schlüssel hinzufügen → Schlüsseltyp = Signing Key.

Test

git commit --allow-empty -m "test signed"
git log --show-signature -1
# Good "git" signature with ED25519 key SHA256:...

Das „Verified"-Abzeichen auf der PR-Seite überprüfen.

allowed_signers-Datei (für lokale Verifizierung erforderlich)

~/.config/git/allowed_signers:

you@example.com ssh-ed25519 AAAA...
coworker@example.com ssh-ed25519 BBBB...
git config --global gpg.ssh.allowedSignersFile "$HOME/.config/git/allowed_signers"

git log --show-signature verifiziert jetzt auch Commits anderer.

4. Mehrere GitHub-Konten (Arbeit + Privat)

4.1 SSH-Konfiguration — Host-Aliasse

~/.ssh/config:

Host github.com-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal
  IdentitiesOnly yes

Host github.com-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
  IdentitiesOnly yes

Klonen:

git clone git@github.com-personal:personal-user/repo.git
git clone git@github.com-work:company/repo.git

4.2 Ordnerspezifische user.email — includeIf

~/.gitconfig:

[user]
    name = Your Name
    email = personal@example.com
 
[includeIf "gitdir:C:/Users/me/work/"]
    path = C:/Users/me/.gitconfig-work

~/.gitconfig-work:

[user]
    email = me@company.com
    signingkey = ssh-ed25519 AAAA... me@company.com

Repos unter C:/Users/me/work/ verwenden automatisch die Arbeits-E-Mail/-Schlüssel.

Prüfen:

cd C:\Users\me\work\some-repo
git config user.email
# me@company.com
 
cd C:\Users\me\personal\some-repo
git config user.email
# personal@example.com

5. 1Password SSH-Agent (optional)

Siehe Passwort-Manager. Unter Windows den Agent-Socket über Umgebungsvariable setzen:

  1. 1Password Desktop → Einstellungen → Entwickler → „SSH-Agent verwenden" ✅
  2. SSH-Schlüssel im 1Password-Vault speichern + bei GitHub registrieren
  3. PowerShell $PROFILE:
    $env:SSH_AUTH_SOCK = '\\.\pipe\openssh-ssh-agent'
  4. Neues Terminal → ssh -T git@github.com → einmal Windows Hello

Jetzt funktionieren SSH und Commit-Signierung ohne ~/.ssh/id_*-Klartextdateien auf der Festplatte.

6. Überprüfung

  1. ssh -T git@github.com — Authentifizierung OK
  2. git clone git@github.com:you/repo.git — keine Passphrase-Eingabe (oder einmaliger biometrischer Tap)
  3. git commit --allow-empty -m test && git log --show-signature -1 — „Good signature"
  4. PR auf GitHub zeigt das „Verified"-Abzeichen
  5. Unterschiedliche git config user.email in Arbeits- vs. privaten Ordnern

Fehlerbehebung

ssh: connect to host github.com port 22: Connection timed out

Unternehmens-Firewall blockiert Port 22. SSH über 443 verwenden:

# ~/.ssh/config
Host github.com
  HostName ssh.github.com
  Port 443

Permission denied (publickey)

  • Dateiberechtigungen des Schlüssels — icacls ~/.ssh/id_ed25519 /inheritance:r /grant:r "$($env:USERNAME):(R)"
  • Öffentlicher Schlüssel nicht bei GitHub registriert

GCM deaktiviert

git config --global credential.helper manager
git config --global credential.helperSelector prompt

1Password SSH-Agent nicht erkannt

  • Desktop-App läuft + angemeldet + Entwickleroption aktiviert
  • Exakter SSH_AUTH_SOCK-Wert (\\.\pipe\openssh-ssh-agent)
  • Konflikt: Wenn der OpenSSH-Agent-Dienst läuft, könnte dessen Socket Vorrang haben. Stop-Service ssh-agent oder deaktivieren

Commit-Signierung zeigt „Unverified"

  • SSH-Schlüssel auf GitHub als Signing Key registrieren (getrennt von der Authentifizierung)
  • git config --global gpg.format ssh fehlt
  • Schlüssel beschädigt — neu generieren + neu registrieren

includeIf wird nicht ausgelöst

  • Git 2.36+ erforderlich (ältere Git for Windows-Versionen ohne Unterstützung)
  • gitdir-Pfad benötigt abschließenden / (C:/Users/me/work/)
  • Unter Windows / statt \ verwenden

Referenzen

Changelog

  • 2026-05-12: Erster Entwurf. GCM + SSH-Schlüssel + SSH-Signierung + Multi-Account + 1Password-Agent + sechs Fehlerbehebungsfälle.