GitHub, GitLab und Bitbucket ohne Passwort-Prompt im Terminal verbinden

Git-Repositories per SSH auschecken: SSH-Key für GitHub, GitLab & Bitbucket einrichten

Du möchtest ein Repository klonen, aber Git fragt ständig nach Benutzername, Passwort oder Token? Für den täglichen Workflow ist SSH meist der sauberere Weg: Ein lokal geschützter privater Schlüssel bleibt auf Deinem Gerät, der passende öffentliche Schlüssel wird einmalig Deinem Konto beim Git-Host zugeordnet.

In diesem Leitfaden erstellst Du ein modernes Ed25519-Schlüsselpaar, richtest den ssh-agent ein und klonst Repositories per SSH von GitHub, GitLab oder Bitbucket. Die Beispiele funktionieren unter Windows, Git Bash, Linux und macOS. Außerdem klären wir, warum .ssh manchmal an einem unerwarteten Ort gesucht wird – und warum ein Access Token kein Ersatz für den Public Key ist.

Illustration eines sicheren SSH-Schlüsselpaares, das ein lokales Terminal mit drei Git-Repository-Knoten verbindet
SSH verbindet Dein lokales Git mit dem Repository-Host, ohne dass der private Schlüssel den eigenen Rechner verlassen muss. KI-generierte Illustration für tiny-tool.de.

Die Kurzantwort

  1. Prüfe, ob Du bereits einen passenden SSH-Key besitzt.
  2. Erzeuge bei Bedarf mit ssh-keygen -t ed25519 ein neues Paar und vergebe eine Passphrase.
  3. Behalte die private Datei lokal. Lade ausschließlich die Datei mit .pub-Endung beim jeweiligen Anbieter hoch.
  4. Lade den privaten Key in den ssh-agent und teste die Verbindung mit ssh -T.
  5. Kopiere die SSH-URL aus dem Repository und starte git clone.

Schnellentscheidung: eigenes Notebook und regelmäßiges Git → SSH mit Ed25519. Firmennetz ohne Port 22 → HTTPS mit Token oder SSH über Port 443. CI, Build-Server oder ein einzelnes Repo → Deploy Key beziehungsweise scoped Token, nicht Deinen privaten Laptop-Key.

🔴 Ein verbreiteter Irrtum

„Ich muss den Public Key als Access-Token im Repository speichern.“

Fast: Bei GitHub und GitLab wird der öffentliche SSH-Key normalerweise Deinem Benutzerkonto zugeordnet; bei Bitbucket ist das eine persönliche SSH-Key-Verknüpfung. Ein Access Token ist dagegen ein anderes Anmeldeverfahren über HTTPS/API. Für den SSH-Weg kopierst Du die vollständige einzeilige .pub-Datei – niemals den privaten Schlüssel und niemals einen Token-String.

SSH oder HTTPS: Welcher Weg passt?

Git unterstützt mehrere Transportwege. Für einen einzelnen Download kann HTTPS mit Git Credential Manager völlig ausreichend sein. Wenn Du jedoch regelmäßig pullst, pushst, Submodule verwendest oder mehrere Repositories betreust, ist SSH angenehm: Der private Schlüssel wird lokal geschützt und Du musst nicht bei jedem Git-Aufruf einen Token in einen Credential-Dialog eingeben.

Vergleich von SSH, HTTPS und speziellen Zugriffsschlüsseln
Variante Typischer Einsatz Wichtig zu wissen
Persönlicher SSH-Key Tägliche Arbeit mit GitHub, GitLab oder Bitbucket Private Datei bleibt auf Deinem Gerät; der Public Key wird Deinem Konto zugeordnet.
HTTPS + Token / Git Credential Manager Umgebungen, in denen SSH blockiert ist, APIs genutzt werden oder bewusst HTTPS vorgegeben wird Token sicher speichern und niemals in URLs, Scripts oder Logs schreiben.
Deploy Key / Repository Access Key CI/CD, Build-Server oder ein einzelnes Repository Kann bewusst auf ein Repository begrenzt sein; bei Bitbucket Cloud sind Repository Access Keys schreibgeschützt.

🟢 Best Practice

Für Dein persönliches Entwicklergerät: ein eigener Ed25519-Key, eine starke Passphrase, SSH-Agent und sprechender Dateiname. Erzeuge pro Gerät oder Sicherheitskontext einen eigenen Key. So kannst Du einen verlorenen Laptop gezielt entziehen, ohne alle anderen Geräte neu zu konfigurieren.

Access Token ist kein SSH-Key

Viele Anleitungen und Fehlermeldungen mischen zwei getrennte Anmeldewege. Ein SSH-Key ist ein Dateipaar. Ein Access Token ist eine vom Anbieter erzeugte Geheimzeichenkette. Beide können Git-Zugriff geben – aber nicht auf demselben Transportweg und nicht über dieselbe Ablage.

Unterschied zwischen SSH-Key und Access Token
SSH-Key Access Token
Transport SSH, typischerweise git@host:pfad.git HTTPS, typischerweise https://host/pfad.git
Was Du erzeugst privates und öffentliches Schlüsselpaar einen Token-String, der oft nur einmal angezeigt wird
Was Du beim Anbieter hinterlegst nur die .pub-Datei nichts Hochladen; der Token wird im Konto erzeugt und später widerrufen
Was geheim bleibt die Datei ohne .pub der komplette Token-String, vergleichbar mit einem Passwort
Typischer Einsatz täglich klonen, pullen, pushen vom eigenen Gerät API, Scripts, CI/CD, Netze ohne SSH-Port 22
Widerruf Public Key in den SSH-Einstellungen löschen Token rotieren oder löschen

Praktisch heißt das: Eine SSH-Remote-URL akzeptiert keinen Personal Access Token. Umgekehrt ersetzt der Public Key keinen Token in einer HTTPS-URL oder in einem REST-Aufruf. Wenn Git nach Benutzername und Passwort fragt, bist Du auf dem HTTPS-Weg – dort gehört ein Token ins Passwortfeld, nicht der Inhalt der .pub-Datei.

Was die drei Anbieter darunter verstehen

  • GitHub: Personal Access Tokens gibt es als fine-grained Variante (github_pat_…) und als classic Token (ghp_…). Sie ersetzen das Kontopasswort bei Git über HTTPS und bei der API. SSH-Keys liegen unter Settings → SSH and GPG keys und sind ein getrenntes Verfahren.
  • GitLab: Personal, Project und Group Access Tokens authentifizieren HTTPS und oft die API. Deploy Tokens sind für Repository und Registry gedacht, nicht für die API. Deploy Keys sind wieder SSH-Schlüssel, gebunden an ein Projekt statt an Dein Konto.
  • Bitbucket Cloud: App Passwords werden abgelöst; Brownouts starteten im Juni 2026, das endgültige Ende ist für den 28. Juli 2026 angekündigt. Ersatz für HTTPS und API sind API tokens with scopes. Persönliche SSH-Keys bleiben davon unberührt.

⚠️ Token niemals in die Clone-URL schreiben

Formen wie https://user:TOKEN@github.com/OWNER/REPO.git landen schnell in Shell-History, CI-Logs, Tickets oder Screenshots. Speichere Tokens im Git Credential Manager, in einem Secret Store oder in einer CI-Variable – nicht in der Remote-URL, nicht im Repository und nicht neben dem Public Key.

🟢 Wann Token, wann SSH?

  1. Eigenes Notebook, regelmäßige Git-Arbeit: SSH-Key.
  2. Port 22 blockiert: zuerst SSH über Port 443 prüfen (GitHub: ssh.github.com, Bitbucket: altssh.bitbucket.org). Sonst HTTPS plus Token.
  3. API-Aufrufe, Skripte, automatisierte Integrationen: Token mit möglichst engem Scope und Ablaufdatum.
  4. Build-Server oder ein einzelnes Repo: Deploy Key beziehungsweise Repository Access Key, nicht den privaten Key Deines Laptops kopieren.

Was ein SSH-Schlüsselpaar macht

Ein SSH-Key besteht aus zwei zusammengehörigen Dateien:

  • id_ed25519 – der private Schlüssel. Er bleibt geheim und verlässt Dein Gerät nicht.
  • id_ed25519.pub – der öffentliche Schlüssel. Dieser darf zum Git-Host hochgeladen werden.

Beim Verbindungsaufbau beweist Dein SSH-Client mit dem privaten Schlüssel, dass er zum hinterlegten Public Key passt. Der private Schlüssel wird dabei nicht an GitHub, GitLab oder Bitbucket übertragen. Eine Passphrase schützt ihn zusätzlich, falls die Datei kopiert wird; der Agent kann die entschlüsselte Identität für Deine Sitzung verwalten.

⚠️ Niemals hochladen

Die Datei mit .pub-Endung ist der öffentliche Schlüssel und gehört in die SSH-Key-Einstellungen des Git-Hosts. Die Datei ohne .pub-Endung ist der private Schlüssel; sie bleibt geheim und gehört weder in GitHub, GitLab oder Bitbucket noch in ein Repository, Ticket, Chat, Backup ohne Schutz oder Screenshot. Wenn ein privater Key versehentlich veröffentlicht wurde, widerrufe den zugehörigen Public Key beim Anbieter und erstelle ein neues Schlüsselpaar.

SSH unter Windows einrichten

Unter Windows kannst Du entweder die OpenSSH-Version von Windows in PowerShell oder die mit Git for Windows gelieferte OpenSSH-Version in Git Bash verwenden. Beide Wege sind legitim. Entscheidend ist, dass Du Key, Agent und Git möglichst in derselben Umgebung verwendest.

1. Installation und vorhandene Keys prüfen

PowerShell
git --version
ssh -V
Get-Command ssh
Get-ChildItem -Force "$env:USERPROFILE\.ssh" -ErrorAction SilentlyContinue

Ist der Ordner nicht vorhanden, ist das kein Fehler: Er wird häufig erst beim ersten Key angelegt. Prüfe vor der Neuerzeugung, ob schon id_ed25519, id_ed25519.pub oder ein bewusst benannter Key existiert.

2. Ed25519-Key erzeugen

Öffne PowerShell oder Git Bash und verwende einen Namen, der den Zweck beschreibt. Wenn der Ordner noch fehlt, lege ihn zuerst an:

PowerShell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
ssh-keygen -t ed25519 -C "name@example.com" -f "$env:USERPROFILE\.ssh\id_ed25519"
Git Bash
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -C "name@example.com" -f ~/.ssh/id_ed25519

Bestätige die Passphrase zweimal. Wenn id_ed25519 bereits existiert, überschreibe ihn nicht unüberlegt. Verwende dann einen eigenen Namen wie id_ed25519_work.

3. Dateirechte der privaten Key-Datei setzen

OpenSSH unter Windows ignoriert einen privaten Key, wenn andere Konten ihn lesen können. Das Gegenstück zu chmod 600 ist eine enge ACL nur für Dein Benutzerkonto:

PowerShell
$key = "$env:USERPROFILE\.ssh\id_ed25519"
icacls $key /inheritance:r
icacls $key /grant:r "$($env:USERNAME):(R)"
icacls $key

Danach sollte in der Ausgabe im Wesentlichen Dein Konto mit Leserecht stehen – nicht Everyone, nicht die komplette Benutzergruppe. Eine Meldung wie UNPROTECTED PRIVATE KEY FILE bedeutet fast immer: Die Datei ist zu offen, nicht dass der Key kryptografisch unbrauchbar wäre.

4. Windows-SSH-Agent nutzen

Mit der OpenSSH-Version von Windows kann der Agent als Windows-Dienst laufen. Die Dienst-Konfiguration erfolgt in einer als Administrator geöffneten PowerShell; den Key selbst lädst Du anschließend in einer normalen Sitzung:

PowerShell als Administrator
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
Get-Service -Name ssh-agent
PowerShell ohne erhöhte Rechte
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"
ssh-add -l

Verwendest Du Git Bash mit der dort gebündelten OpenSSH-Version, starte stattdessen den Agent in Git Bash:

Git Bash
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

🪟 Windows-Pfad in einem Satz

Die Standardablage des Windows-OpenSSH-Clients liegt unter %USERPROFILE%\.ssh, also typischerweise C:\Users\\.ssh. Ein Pfad wie C:\Users\\Documents\.ssh ist keine allgemeine OpenSSH-Vorgabe. Er kann durch eine bewusst gesetzte HOME-Umgebung, Git-Bash-/MSYS-Konfiguration, WSL oder eine eigene SSH-Konfiguration entstehen.

SSH unter Linux einrichten

Auf vielen Linux-Distributionen ist der OpenSSH-Client bereits vorhanden. Falls nicht, installiere das Paket Deiner Distribution. Danach prüfst Du Version und vorhandene Schlüssel:

Linux
git --version
ssh -V
ls -la ~/.ssh

Erzeuge einen Key mit einer sicheren Passphrase:

Linux
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "name@example.com" -f ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

Für eine laufende Shell-Sitzung startest Du den Agent und lädst den privaten Key:

Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l

Desktop-Umgebungen können den Agent über einen Keyring starten. Trage den Startbefehl nicht gedankenlos mehrfach in .bashrc, .zshrc und .profile ein – mehrere Agenten machen die Fehlersuche eher schwerer.

SSH unter macOS einrichten

Unter macOS ist der OpenSSH-Client Teil des Systems. Der Ablauf entspricht Linux, der Agent kann die Passphrase aber zusätzlich in der Schlüsselbundverwaltung halten. So musst Du sie nicht nach jedem Neustart erneut eintippen.

macOS
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -C "name@example.com" -f ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
ssh-add -l

Damit der Key nach dem Login automatisch geladen wird, ergänzt Du in ~/.ssh/config:

~/.ssh/config · macOS
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

Eine allgemeine Host *-Regel gehört ans Ende der Datei. Spezifische Blöcke für GitHub, GitLab oder Bitbucket setzt Du davor, sonst gewinnt die erste zu breite Regel.

Public Key bei GitHub, GitLab und Bitbucket hinterlegen

Jetzt wird nur der öffentliche Teil kopiert. Der Inhalt beginnt typischerweise mit ssh-ed25519 und steht in genau einer Zeile. Kommentar und Zeilenende dürfen mitkopiert werden, zusätzliche Umbrüche oder abgeschnittene Zeichen nicht.

GitHub

Kopiere den Public Key und öffne anschließend in GitHub Settings → SSH and GPG keys → New SSH key. Verwende für Git-Zugriff den Typ Authentication, vergebe einen sprechenden Titel und füge die komplette Zeile ein.

Public Key kopieren
# PowerShell
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | Set-Clipboard

# Git Bash
cat ~/.ssh/id_ed25519.pub | clip

# WSL
cat ~/.ssh/id_ed25519.pub | clip.exe

# macOS
pbcopy < ~/.ssh/id_ed25519.pub

GitHub weist darauf hin, dass DSA nicht mehr unterstützt wird und ältere RSA-Konstellationen Einschränkungen haben können. Ed25519 ist für aktuelle Clients der passende Standard.

GitLab

Öffne GitLab, wähle Dein Avatar-Menü und gehe zu Edit profile → Access → SSH keys → Add new key. Füge den Public Key ein, vergebe einen Titel und prüfe – sofern angeboten – Nutzungsart und Ablaufdatum.

Public Key kopieren
# Linux mit xclip
xclip -sel clip < ~/.ssh/id_ed25519.pub

# Git Bash on Windows
cat ~/.ssh/id_ed25519.pub | clip

# WSL
cat ~/.ssh/id_ed25519.pub | clip.exe

# macOS
pbcopy < ~/.ssh/id_ed25519.pub

Ein Benutzer-Key gilt bei GitLab für alle Projekte und Gruppen, auf die Dein Konto zugreifen darf. Eine separate Datei pro Projekt ist normalerweise nicht nötig.

Bitbucket Cloud

Für den persönlichen Zugriff gehst Du zu Personal Bitbucket settings → Security → SSH keys → Add key. Label eintragen, den kompletten Inhalt der .pub-Datei in das Key-Feld kopieren und – falls gewünscht – einen Ablauf festlegen.

Bitbucket unterscheidet außerdem zwischen persönlichen SSH-Keys und Repository Access Keys. Letztere sind für Automation beziehungsweise einzelne Repositories gedacht und gewähren nur Lesezugriff. Für Deinen normalen Laptop-Workflow ist der persönliche SSH-Key die passendere Wahl.

🔐 Sicherheitsprüfung vor dem Speichern

  • Beginnt die Zeile mit ssh-ed25519?
  • Hast Du wirklich id_ed25519.pub und nicht id_ed25519 geöffnet?
  • Ist die Zeile vollständig und ohne zusätzliche Leerzeilen?
  • Ist der Titel so verständlich, dass Du das Gerät später wiedererkennst?

Repository per SSH klonen

Öffne im jeweiligen Repository den Dialog Code beziehungsweise Clone, wähle SSH und kopiere die angebotene URL. Die üblichen Formen sehen so aus:

Beispiele für SSH-Clone-URLs
Anbieter SSH-URL Verbindung testen
GitHub git@github.com:OWNER/REPOSITORY.git ssh -T git@github.com
GitLab git@gitlab.com:GROUP/PROJECT.git ssh -T git@gitlab.com
Bitbucket Cloud git@ssh.bitbucket.org:WORKSPACE/REPOSITORY.git ssh -T git@ssh.bitbucket.org

🧭 Bitbucket Cloud: SSH-Host wechselt 2026

Bitbucket Cloud trennt SSH- und HTTPS-Verkehr. Bis zum 12. November 2026 funktionieren bestehende URLs der Form git@bitbucket.org:WORKSPACE/REPOSITORY.git in der Regel weiter. Danach sollen SSH-Verbindungen gegen bitbucket.org abgelehnt werden. Stelle rechtzeitig auf git@ssh.bitbucket.org:WORKSPACE/REPOSITORY.git um und prüfe den neuen Host-Fingerprint. HTTPS-URLs über https://bitbucket.org/… sind von dieser Trennung nicht betroffen.

Klonen
cd ~/Projekte
git clone git@github.com:OWNER/REPOSITORY.git
cd REPOSITORY
git remote -v

Bei der ersten Verbindung prüft SSH den Host-Schlüssel. Bestätige ihn nur, wenn der angezeigte Fingerabdruck zum offiziell veröffentlichten Fingerprint des Anbieters passt. GitHub, GitLab und Bitbucket bieten dafür eigene Hinweise beziehungsweise Fingerprint-Seiten an.

Vorhandenes HTTPS-Repository auf SSH umstellen

Du musst nicht neu klonen, wenn das Repository schon lokal liegt. Ersetze nur die Remote-URL:

Beispiel GitHub
git remote -v
git remote set-url origin git@github.com:OWNER/REPOSITORY.git
git remote -v
git fetch
Beispiel Bitbucket Cloud
git remote set-url origin git@ssh.bitbucket.org:WORKSPACE/REPOSITORY.git
git remote -v
git fetch

Für GitLab ersetzt Du Host und Pfad durch die vom Repository kopierte SSH-URL. Git dokumentiert sowohl die ssh://-Form als auch die verbreitete SCP-ähnliche Form git@host:pfad.

Mehrere Keys und abweichende Ablageorte

Ein eigener Dateiname pro Anbieter oder Arbeitskontext hilft, wenn Du mehrere Konten, Firmeninstanzen oder getrennte Sicherheitsbereiche verwendest. Der SSH-Client kann anhand des Hosts die passende Identität wählen.

~/.ssh/config
Host github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github
  IdentitiesOnly yes

Host gitlab.com
  User git
  IdentityFile ~/.ssh/id_ed25519_gitlab
  IdentitiesOnly yes

Host bitbucket.org ssh.bitbucket.org
  HostName ssh.bitbucket.org
  User git
  IdentityFile ~/.ssh/id_ed25519_bitbucket
  IdentitiesOnly yes

Die Datei liegt unter Linux und macOS normalerweise in ~/.ssh/config; der Windows-OpenSSH-Client liest standardmäßig %USERPROFILE%\.ssh\config. Unter Windows darf der Pfad in der Datei auch mit ~/.ssh/... geschrieben werden. Der Bitbucket-Block fängt sowohl alte als auch neue Hostnamen ein und leitet sie auf ssh.bitbucket.org.

🧭 Wenn .ssh unter Documents statt unter dem Benutzerprofil auftaucht

Verwende nicht einfach irgendeinen Ordner, nur weil ein Tool ihn vorschlägt. Ermittle zuerst, welche SSH-Umgebung aktiv ist:

Git Bash
printf 'HOME=%s\n' "$HOME"
ssh -G github.com | grep -Ei 'identityfile|userknownhostsfile|globalknownhostsfile'
PowerShell
$env:USERPROFILE
$env:HOME
ssh -G github.com | Select-String 'identityfile|userknownhostsfile|globalknownhostsfile'

Git Bash/MSYS, Windows OpenSSH und WSL können unterschiedliche Home-Verzeichnisse haben. Ein Key in C:\Users\Name\.ssh ist nicht automatisch in /home/name/.ssh unter WSL verfügbar. Lege bewusst fest, welche Umgebung Git verwendet, und verweise bei Bedarf über IdentityFile auf den richtigen privaten Key.

Weitere Schlüsselpaare anlegen, ohne vorhandene zu überschreiben

Ein neues Schlüsselpaar beschädigt die alten Keys nicht – gefährlich wird es nur, wenn Du dieselben Dateinamen verwendest oder eine bestehende config unkontrolliert überschreibst. Arbeite deshalb mit einem Namensschema, zum Beispiel id_ed25519_github_personal, id_ed25519_github_work und id_ed25519_gitlab.

🧰 Sichere Erstellungsroutine

  1. Vorher den Ordnerinhalt prüfen und niemals eine vorhandene Datei ohne Rückfrage überschreiben.
  2. Beim Erzeugen immer -f mit einem neuen, eindeutigen Dateinamen angeben.
  3. Für jeden Key eine eigene starke Passphrase vergeben und im Kommentar den Zweck oder das Gerät notieren.
  4. Direkt danach den Fingerprint des Public Keys anzeigen und den Key beim richtigen Konto hinterlegen.
Neue Keys mit eigenen Dateinamen
# Git Bash / Linux / macOS
ssh-keygen -t ed25519 -C "privat@example.com" -f ~/.ssh/id_ed25519_github_personal
ssh-keygen -t ed25519 -C "arbeit@example.com" -f ~/.ssh/id_ed25519_github_work

# Fingerprints vergleichen
ssh-keygen -lf ~/.ssh/id_ed25519_github_personal.pub
ssh-keygen -lf ~/.ssh/id_ed25519_github_work.pub

Die beiden Paare liegen nebeneinander: Jeweils die Datei ohne Endung ist privat, die gleichnamige Datei mit .pub ist öffentlich. Bestehende Keys bleiben unangetastet. Beim Hinzufügen zeigt ssh-keygen normalerweise eine Warnung, falls der angegebene Dateiname bereits vorhanden ist – bestätige ein Überschreiben nur dann, wenn Du den alten Key bewusst ersetzen möchtest.

Den SSH-Agent sauber verwalten

Der Agent ist nur ein Zwischenspeicher für private Schlüssel in Deiner laufenden Umgebung. Er ist nicht dasselbe wie die Dateiablage und auch nicht dasselbe wie known_hosts. Prüfe vor Änderungen, welche Identitäten geladen sind:

Agent-Inventur
ssh-add -l

# Einen einzelnen Key entfernen
ssh-add -d ~/.ssh/id_ed25519_github_work

# Nur im Notfall: alle geladenen Keys aus diesem Agent entfernen
ssh-add -D

ssh-add -D löscht keine Dateien und entfernt auch keinen Public Key beim Anbieter – es leert nur den Agent. Danach musst Du die benötigten privaten Keys erneut mit ssh-add laden. Für mehrere Identitäten ist IdentitiesOnly yes in der passenden Host-Regel besonders hilfreich, weil dann nicht versehentlich der zuerst angebotene falsche Key verwendet wird.

Mehrere Konten beim selben Host: Host-Aliase verwenden

Ein Hostname allein reicht nicht aus, um zwei Konten bei demselben Anbieter zu unterscheiden. Zwei getrennte Host github.com-Blöcke sind deshalb keine gute Lösung. Verwende Aliase: Host ist der Name, den Git in der Remote-URL sieht; HostName bleibt der echte Server.

~/.ssh/config – zwei GitHub-Konten
# Persönliches Konto
Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_personal
  IdentitiesOnly yes

# Arbeitskonto
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_work
  IdentitiesOnly yes

Die Remote-URL muss dann den Alias enthalten:

Alias in Git verwenden
git clone git@github-personal:OWNER/REPOSITORY.git
git remote set-url origin git@github-work:ORGANIZATION/REPOSITORY.git

Dasselbe Muster funktioniert für mehrere GitLab-Konten auf einer Instanz und für mehrere Bitbucket-Cloud-Konten. Für Bitbucket setzt Du HostName ssh.bitbucket.org. Nach dem Einrichten testest Du jeden Alias einzeln:

Jeden Alias separat testen
ssh -T git@github-personal
ssh -T git@github-work
ssh -G github-work | grep -Ei 'hostname|identityfile|identitiesonly|userknownhostsfile'

Bei Bitbucket ist dieses Vorgehen besonders wichtig: Wenn mehrere Keys im Agent liegen, kann sonst ein gültiger, aber für das gewünschte Konto falscher Key zuerst angeboten werden. Das Ergebnis sieht dann schnell wie ein fehlendes Repository oder eine falsche Berechtigung aus.

Was config und known_hosts jeweils machen

Rollen der SSH-Dateien bei mehreren Schlüsselpaaren
Datei / Speicher Aufgabe Bezug zu mehreren Keypaaren
id_ed25519_… Privater Benutzer-Key Für jeden Sicherheitskontext eigener Dateiname; niemals veröffentlichen.
id_ed25519_….pub Öffentlicher Benutzer-Key Zum passenden Konto oder Access-Key-Verzeichnis des Git-Hosts hochladen.
config Regeln: welcher Alias nutzt welchen Host, User und privaten Key? Mehrere Host-Blöcke ordnen Keys Konten oder Anbietern zu.
known_hosts Bekannte öffentliche Host-Keys beziehungsweise Server-Fingerprints Unabhängig vom Benutzer-Key; beschreibt den Server, nicht Dein Konto.
ssh-agent Zwischenspeicher für geladene private Keys und Passphrasen Kann viele Keys enthalten; IdentitiesOnly yes begrenzt, welcher verwendet wird.

known_hosts: nicht mit den Benutzer-Keys verwechseln

known_hosts speichert die Identität des Servers, zum Beispiel von github.com, gitlab.com oder ssh.bitbucket.org. Die Datei entscheidet nicht, mit welchem Benutzerkonto Du Dich authentifizierst. Dafür sind private Key, Public Key, Agent und config zuständig.

Normalerweise teilen sich alle Deine Host-Aliase dieselbe known_hosts-Datei der aktiven SSH-Umgebung. Du brauchst also nicht für jedes Schlüsselpaar eine neue Datei. Unter Windows ist der Standardpfad des OpenSSH-Clients %USERPROFILE%\.ssh\known_hosts; Git Bash, WSL und macOS können jeweils eigene Home-Verzeichnisse und damit eigene Dateien verwenden.

known_hosts prüfen
# Eintrag suchen
ssh-keygen -F github.com -f ~/.ssh/known_hosts
ssh-keygen -F ssh.bitbucket.org -f ~/.ssh/known_hosts

# Effektive Datei für einen Alias anzeigen
ssh -G github-work | grep -Ei 'hostname|userknownhostsfile'

Eine Warnung wie REMOTE HOST IDENTIFICATION HAS CHANGED bedeutet nicht automatisch, dass Du nur den Eintrag löschen musst. Prüfe zuerst, ob der Fingerprint beim Anbieter oder beim zuständigen Administrator geändert wurde. Erst wenn die Änderung verifiziert ist, kann ein einzelner alter Eintrag gezielt mit ssh-keygen -R github.com beziehungsweise dem verwendeten Alias entfernt und anschließend neu gelernt werden. Die komplette Datei zu löschen oder die Host-Key-Prüfung abzuschalten, ist keine gute Reparaturstrategie.

Die sichere Änderungsroutine

  1. Vor einer Änderung eine Kopie von config und known_hosts an einem geschützten Ort anlegen.
  2. Neue Keypaare immer mit neuem Dateinamen erstellen; vorhandene Dateien nicht überschreiben.
  3. Neue Host-Blöcke eindeutig kommentieren und spezifische Regeln vor allgemeine Host *-Regeln setzen.
  4. Mit ssh -G alias kontrollieren, welcher Host, Key und welche known_hosts-Datei effektiv verwendet werden.
  5. Jeden Alias mit ssh -T testen und erst danach die Git-Remote-URL ändern.

Typische Fehler systematisch lösen

SSH-Fehler beim Git-Zugriff und passende Gegenmaßnahmen
Fehlerbild Wahrscheinliche Ursache Prüfung
Permission denied (publickey) Falscher Host/User, Public Key nicht hinterlegt oder falsche Identität gewählt ssh -vT git@github.com; immer den User git und den richtigen Host verwenden.
Could not open a connection to your authentication agent Agent läuft in dieser Shell nicht oder ssh-add stammt aus einer anderen Umgebung Agent starten, danach ssh-add -l ausführen.
UNPROTECTED PRIVATE KEY FILE Private Datei ist für andere Konten lesbar Linux/macOS: chmod 600. Windows: ACL mit icacls auf Dein Konto begrenzen.
No such file or directory ~, HOME oder Dateiname zeigt auf einen anderen Ordner Effektiven Pfad mit ssh -G host und der passenden Shell-Variable prüfen.
„SSH key is invalid“ Public Key abgeschnitten, falsche Datei oder zusätzliche Umbrüche Den vollständigen Inhalt der .pub-Datei erneut kopieren.
Host key verification failed Unbekannter oder geänderter Host-Fingerprint Fingerprint beim Anbieter verifizieren; nicht blind known_hosts löschen.
Repository not found Repository-Pfad falsch, Konto hat keine Berechtigung oder bei Bitbucket noch der alte SSH-Host SSH-Verbindung separat testen und anschließend die Clone-URL aus dem Repository neu kopieren.

Für die Fehlersuche ist -v hilfreich, weil SSH dann zeigt, welche Konfiguration und welche Schlüsseldateien verwendet werden. Die Ausgabe kann sensible Pfade und Hostnamen enthalten – teile sie nicht ungeprüft öffentlich.

Glossar

Kurze Begriffsklärung für die wichtigsten Bauteile dieses Leitfadens. Die ausführliche Einrichtung steht in den Kapiteln darüber.

Privater Schlüssel
Die Datei ohne .pub-Endung, zum Beispiel id_ed25519. Sie bleibt auf Deinem Gerät, bekommt eine Passphrase und wird höchstens in den lokalen ssh-agent geladen.
Public Key
Die Datei mit .pub-Endung. Eine Zeile, typischerweise beginnend mit ssh-ed25519. Nur dieser Teil wird beim Git-Host hinterlegt.
Passphrase
Zusätzlicher Schutz der privaten Key-Datei. Sie ist nicht das Konto-Passwort bei GitHub, GitLab oder Bitbucket.
ssh-agent
Lokaler Zwischenspeicher für geladene private Keys. Er merkt sich die entsperrte Identität für die Sitzung, speichert aber weder Dateien noch den Public Key beim Anbieter.
IdentityFile
Angabe in ~/.ssh/config, welcher private Key für einen Host oder Alias verwendet wird.
IdentitiesOnly
Verhindert, dass SSH nacheinander beliebige Keys aus dem Agent anbietet. Besonders wichtig bei mehreren Konten.
Host-Alias
Ein selbst vergebener Name in der SSH-Config, etwa github-work. In der Git-URL steht dann git@github-work:…, der echte Server bleibt über HostName erhalten.
known_hosts
Liste bekannter Server-Fingerprints. Sie beschreibt den Git-Host, nicht Dein Benutzerkonto.
Host-Fingerprint
Prüfwert des Server-Schlüssels. Beim ersten Verbinden vergleichst Du ihn mit der offiziellen Angabe des Anbieters.
Access Token / PAT
Vom Anbieter erzeugte Geheimzeichenkette für HTTPS und oft die API. Sie ist widerrufbar und kann zeitlich sowie thematisch begrenzt sein. Sie ist kein SSH-Schlüsselpaar und gehört nicht in eine SSH-URL.
Git Credential Manager
Hilfsprogramm, das HTTPS-Zugangsdaten – in der Praxis meist Tokens – sicher speichert, damit Git sie nicht in der Remote-URL ablegen muss.
Deploy Key / Repository Access Key
SSH-Public-Key, der an ein Repository oder einen Automationskontext gebunden ist statt an Dein persönliches Konto. Bei Bitbucket Cloud oft nur lesend.
Ed25519
Aktueller Standard-Schlüsseltyp für OpenSSH-Clients. Kürzer und moderner als klassisches RSA; RSA bleibt vor allem als Kompatibilitätsweg mit mindestens 4096 Bit relevant.
SSH-URL / HTTPS-URL
Zwei Transportwege desselben Repositories. SSH beginnt typischerweise mit git@, HTTPS mit https://. Die Wahl der URL entscheidet, ob Key oder Token zum Einsatz kommt.

Häufige Fragen

Ist Ed25519 besser als RSA?

Für aktuelle OpenSSH-Clients ist Ed25519 die sinnvolle Standardwahl: GitHub und GitLab führen Ed25519 als bevorzugten beziehungsweise modernen Schlüsseltyp. RSA bleibt als Kompatibilitätsweg für alte Systeme relevant; dann sollte die Schlüssellänge mindestens 4096 Bit betragen. DSA solltest Du nicht neu verwenden.

Kann ich denselben SSH-Key bei allen drei Anbietern verwenden?

Technisch ist das möglich, weil jeder Anbieter denselben Public Key speichern kann. Aus Sicherheits- und Verwaltungsgründen sind getrennte Keys pro Gerät oder Kontext oft besser: Ein einzelner entfernter Key sperrt dann nicht gleich alle Zugänge. Dieselbe Überlegung gilt für Tokens – Wiederverwenden ist möglich, sauber rotieren ist besser.

Brauche ich zusätzlich einen Access Token, wenn SSH schon funktioniert?

Für normales Klonen, Pullen und Pushen nicht. Ein Token brauchst Du, wenn ein Tool die HTTP-API spricht, SSH im Netz blockiert ist oder eine Richtlinie ausdrücklich HTTPS verlangt. Beides parallel zu pflegen ist üblich, beides durcheinanderzuwerfen nicht.

Kann ich den Public Key ins Repository committen?

Der Public Key ist nicht geheim, aber er gehört in die Kontoeinstellungen oder die dafür vorgesehene Access-Key-Verwaltung des Hosts. Ein Commit macht ihn nicht zu einer funktionierenden Repository-Berechtigung und stiftet eher Verwirrung.

Warum fragt Git trotz Agent nach der Passphrase?

Häufig läuft der Agent nicht in der aktuellen Shell, der Key wurde nach einem Neustart nicht geladen oder Git verwendet einen anderen SSH-Client. Prüfe ssh-add -l, Get-Command ssh beziehungsweise which ssh und die Ausgabe von ssh -vT.

Was mache ich bei einer blockierten Firewall?

Prüfe zuerst, ob der Netzwerkzugang zu Port 22 eingeschränkt ist. GitHub dokumentiert als Ausweichweg SSH über Port 443 mit dem Host ssh.github.com. Bitbucket Cloud bietet analog altssh.bitbucket.org auf Port 443. Ob das in Deinem Unternehmensnetz erlaubt ist, entscheidet die lokale Firewall- und Proxy-Konfiguration.

Brauche ich einen SSH-Key für ein öffentliches Repository?

Zum Lesen eines öffentlichen Repositorys nicht zwingend. SSH lohnt sich trotzdem, wenn Du einheitlich klonen, später pushen oder private Abhängigkeiten aus demselben Workflow nutzen möchtest.

Fazit: Einmal sauber einrichten, dauerhaft entspannt klonen

Git-Repositories per SSH auszuchecken ist kein geheimnisvoller Spezialweg. Du erzeugst ein Schlüsselpaar, schützt den privaten Teil mit einer Passphrase, lädst nur den Public Key beim Anbieter hoch und lässt den Agent die lokale Nutzung vereinfachen.

Mit Ed25519, sprechenden Dateinamen, getrennten Keys pro Gerät oder Kontext und einem kurzen Verbindungstest bist Du für GitHub, GitLab und Bitbucket gut aufgestellt. Access Tokens bleiben der HTTPS- und API-Weg – sie ersetzen weder den Public Key noch gehören sie in eine SSH-URL.

Falls ein Pfad unter Windows unerwartet nach Documents\.ssh zeigt, ist das meist ein Hinweis auf unterschiedliche Shells oder eine veränderte Home-Konfiguration – nicht auf eine neue allgemeine Windows-Vorgabe. Bei Bitbucket Cloud solltest Du den SSH-Host ssh.bitbucket.org mitdenken, bevor die Übergangsfrist im November 2026 endet.

Merksatz: Public Key hochladen, private Datei schützen, Token nicht mit dem Key verwechseln, Host-Fingerprint prüfen, SSH-URL kopieren – dann übernimmt Git den Rest.

Quellen & weiterführende Informationen

Technischer Stand dieses Artikels: 13. September 2026. Die Links führen zu den offiziellen Dokumentationen der jeweiligen Projekte beziehungsweise Anbieter.

Transparenzhinweis


Transparenzhinweis:
Die Inhalte auf tiny-tool.de werden sorgfältig recherchiert, redaktionell geprüft und regelmäßig aktualisiert. Quellen und Zitate werden möglichst nachvollziehbar angegeben. Dennoch übernehmen wir keine Garantie für Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen. Irrtümer sind nicht ausgeschlossen.

Redaktion und Einsatz von KI: Bei der Erstellung von Inhalten können digitale Werkzeuge – darunter auch KI-basierte Assistenzsysteme – unterstützend eingesetzt werden, etwa bei Recherche, Strukturierung, sprachlicher Überarbeitung, Übersetzung, Codeanalyse oder visueller Gestaltung. Veröffentlichte Inhalte werden redaktionell geprüft, bearbeitet und von Guido Zeuner freigegeben. Auswahl, Einordnung und Veröffentlichung liegen beim Menschen. KI-Ausgaben gelten nicht als eigenständige Quellen. KI-Systeme sind keine verantwortlichen Autoren oder Redakteure. Weitere Informationen zu Texten, Bildern, Videos und digitalen Personas findest du auf unserer Seite Transparenz beim Einsatz von Künstlicher Intelligenz.

Reichweitenmessung (VG WORT / METIS): Zur Ermittlung der Reichweite einzelner Texte können Zählmarken der VG WORT eingesetzt werden. Im Rahmen der METIS-Zugriffszählung kann eine Client-ID gebildet und ein sogenanntes „METIS Session Cookie“ gesetzt werden. Die Messung dient der statistischen Ermittlung von Textzugriffen und als Grundlage für mögliche Ausschüttungen der VG WORT. Nach Angaben der VG WORT werden dabei keine personenbezogenen Nutzungsprofile erstellt; die Messung dient nicht der Werbung oder dem Marketing-Tracking. Weitere Informationen findest du in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung dar, insbesondere keine rechtliche, steuerliche, medizinische, technische oder finanzielle Beratung. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung.

Werbung und Affiliate-Links: Einige Beiträge können werbliche Hinweise oder sogenannte Affiliate-Links enthalten. Diese werden entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten; wir erhalten gegebenenfalls eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden ausschließlich zur Identifikation und Beschreibung verwendet. Eine Verbindung zu den genannten Unternehmen besteht nur, wenn dies ausdrücklich angegeben wird.

Externe Links: Diese Website enthält Verweise auf externe Websites Dritter. Trotz sorgfältiger Prüfung übernehmen wir keine Verantwortung für deren Inhalte. Bei Bekanntwerden rechtswidriger Inhalte werden entsprechende Links geprüft und gegebenenfalls entfernt.