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.

Die Kurzantwort
- Prüfe, ob Du bereits einen passenden SSH-Key besitzt.
- Erzeuge bei Bedarf mit
ssh-keygen -t ed25519ein neues Paar und vergebe eine Passphrase. - Behalte die private Datei lokal. Lade ausschließlich die Datei mit
.pub-Endung beim jeweiligen Anbieter hoch. - Lade den privaten Key in den
ssh-agentund teste die Verbindung mitssh -T. - 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.
| 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.
| 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?
- Eigenes Notebook, regelmäßige Git-Arbeit: SSH-Key.
- Port 22 blockiert: zuerst SSH über Port 443 prüfen (GitHub:
ssh.github.com, Bitbucket:altssh.bitbucket.org). Sonst HTTPS plus Token. - API-Aufrufe, Skripte, automatisierte Integrationen: Token mit möglichst engem Scope und Ablaufdatum.
- 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
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:
New-Item -ItemType Directory -Force "$env:USERPROFILE\.ssh" | Out-Null
ssh-keygen -t ed25519 -C "name@example.com" -f "$env:USERPROFILE\.ssh\id_ed25519"
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:
$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:
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
Get-Service -Name ssh-agent
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:
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\. Ein Pfad wie C:\Users\ 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:
git --version
ssh -V
ls -la ~/.ssh
Erzeuge einen Key mit einer sicheren Passphrase:
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:
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.
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:
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.
# 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.
# 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.pubund nichtid_ed25519geö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:
| 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.
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:
git remote -v
git remote set-url origin git@github.com:OWNER/REPOSITORY.git
git remote -v
git fetch
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.
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:
printf 'HOME=%s\n' "$HOME"
ssh -G github.com | grep -Ei 'identityfile|userknownhostsfile|globalknownhostsfile'
$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
- Vorher den Ordnerinhalt prüfen und niemals eine vorhandene Datei ohne Rückfrage überschreiben.
- Beim Erzeugen immer
-fmit einem neuen, eindeutigen Dateinamen angeben. - Für jeden Key eine eigene starke Passphrase vergeben und im Kommentar den Zweck oder das Gerät notieren.
- Direkt danach den Fingerprint des Public Keys anzeigen und den Key beim richtigen Konto hinterlegen.
# 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:
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.
# 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:
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:
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
| 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.
# 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
- Vor einer Änderung eine Kopie von
configundknown_hostsan einem geschützten Ort anlegen. - Neue Keypaare immer mit neuem Dateinamen erstellen; vorhandene Dateien nicht überschreiben.
- Neue
Host-Blöcke eindeutig kommentieren und spezifische Regeln vor allgemeineHost *-Regeln setzen. - Mit
ssh -G aliaskontrollieren, welcher Host, Key und welcheknown_hosts-Datei effektiv verwendet werden. - Jeden Alias mit
ssh -Ttesten und erst danach die Git-Remote-URL ändern.
Typische Fehler systematisch lösen
| 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 Beispielid_ed25519. Sie bleibt auf Deinem Gerät, bekommt eine Passphrase und wird höchstens in den lokalenssh-agentgeladen. - Public Key
- Die Datei mit
.pub-Endung. Eine Zeile, typischerweise beginnend mitssh-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 danngit@github-work:…, der echte Server bleibt überHostNameerhalten. - 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 mithttps://. 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.
- GitHub Docs: Generating a new SSH key and adding it to the ssh-agent
- GitHub Docs: Adding a new SSH key to your GitHub account
- GitHub Docs: Testing your SSH connection
- GitHub Docs: Error: Permission denied (publickey)
- GitHub Docs: Using SSH over the HTTPS port
- GitHub Docs: Managing your personal access tokens
- GitHub Docs: About authentication to GitHub
- GitLab Docs: Use SSH keys with GitLab
- GitLab Docs: Advanced SSH key configuration
- GitLab Docs: Troubleshooting SSH
- GitLab Docs: Token overview
- GitLab Docs: Personal access tokens
- Atlassian Support: Set up personal SSH keys on Windows
- Atlassian Support: Configure SSH and two-step verification
- Atlassian Support: Set up Repository Access keys on Windows
- Atlassian Support: API tokens
- Atlassian Support: Using API tokens
- Atlassian Support: Using App passwords (Deprecation)
- Atlassian Support: Port 22 is blocked on local network
- Atlassian Community: Upcoming change to Bitbucket Cloud SSH access (ssh.bitbucket.org)
- Microsoft Learn: Key-Based Authentication in OpenSSH for Windows
- Microsoft Learn: OpenSSH Server Configuration for Windows
- Git Documentation: git-clone / Git URLs
- Git Documentation: git-config / core.sshCommand
- OpenBSD OpenSSH Manual: ssh_config
- GitHub Docs: Managing multiple accounts
- GitHub Docs: Error: Key already in use
- Atlassian Support: Managing multiple Bitbucket user SSH keys on one device



tiny-tool.de