Die Ver­wen­dung eines SSH-Keys mit GitHub er­mög­licht den pass­wort­lo­sen Zugriff auf Git-Re­po­si­to­ries. Anstatt einen Nutzer per Nut­zer­na­me und Passwort aus­zu­wei­sen, wird die Ent­wick­ler­ma­schi­ne über den SSH-Key au­then­ti­fi­ziert.

Free VPS Trial
vServer kostenlos testen für 30 Tage

Lassen Sie sich von den Vorteilen über­zeu­gen. Probieren Sie Ihren Virtual Server ganz in Ruhe 30 Tage lang aus!

Was ist ein SSH-Key?

Bei der Secure Shell (SSH) handelt es sich um das Standard-Tool für ver­schlüs­sel­ten Zugriff auf entfernte Systeme. SSH er­mög­licht das Einloggen auf einem Server von der hei­mi­schen Ent­wick­ler­ma­schi­ne aus. Git nutzt SSH als Über­tra­gungs­pro­to­koll und erlaubt lesenden und schrei­ben­den Zugriff auf Remote-Re­po­si­to­ries.

Um die Au­then­ti­fi­zie­rung der Maschine zu er­mög­li­chen und die Fäl­schungs­si­cher­heit der über­tra­ge­nen Daten si­cher­zu­stel­len, kommt eine ver­schlüs­sel­te Ver­bin­dung zum Einsatz. Ohne diese wäre es Fremden möglich, beliebige Än­de­run­gen an Re­po­si­to­ries vor­zu­neh­men.

Git per SSH nutzt asym­me­tri­sche Ver­schlüs­se­lung als kryp­to­gra­fi­sches Verfahren. Dabei wird zunächst ein Paar aus privatem und öf­fent­li­chem Schlüssel erstellt. Man spricht auch von einem „Public-Private Keypair“. Der private Schlüssel verbleibt auf dem eigenen Rechner. Der öf­fent­li­che Schlüssel wird mit dritten Parteien, z. B. GitHub, geteilt.

Nutzt man einen SSH-Key zum Zugriff auf GitHub-Re­po­si­to­ries, entfällt die Eingabe eines Kennworts. Generell gilt pass­wort­lo­ses Anmelden als sicherer, da kein Passwort durch Keylogger oder Trojaner ab­ge­grif­fen werden kann. Statt einer Person, die das Passwort kennt, wird eine Maschine au­then­ti­fi­ziert, auf welcher der private Schlüssel hin­ter­legt ist.

Die Nutzung von Git über SSH ist aus­ge­spro­chen praktisch. Einmal ein­ge­rich­tet, erlaubt der SSH-Key dau­er­haf­ten Zugriff auf GitHub ohne weiteres Zutun. Auch andere Pro­to­kol­le und Dienste pro­fi­tie­ren von SSH-Keys für eine ver­schlüs­sel­te Netz­werk­ver­bin­dung. Neben Git mit SSH lässt sich das sichere SFTP-Protokoll zum Austausch von Dateien mit Servern einsetzen, ohne dass weitere Kon­fi­gu­ra­ti­on vonnöten wäre.

Die Ver­bin­dung mit Git-Re­po­si­to­ries erfolgt in der Regel von der Kom­man­do­zei­le aus. Wurde ein SSH-Key ein­ge­rich­tet, lässt sich pro­blem­los ein Push auf ein eigenes Re­po­si­to­ry ausführen:

cd ./folder-with-git-repo/
git push
bash

Neben der Anwendung auf der Kom­man­do­zei­le pro­fi­tie­ren auch GUI-An­wen­dun­gen von einem ein­ge­rich­te­ten SSH-Schlüssel. Moderne FTP-Programme un­ter­stüt­zen das SSH Flie Transfer Protocol (SFTP). Dieses basiert auf SSH und greift auf vor­han­de­ne SSH-Schlüssel zurück

Wie nutzt man SSH-Keys mit GitHub

Um mit einem SSH-Key auf sein GitHub-Konto zu­zu­grei­fen, hin­ter­legt man den öf­fent­li­chen Schlüssel bei GitHub. Der private Schlüssel verbleibt auf dem eigenen Rechner. Über einen Abgleich der Schlüs­sel­da­ten wird die Ent­wick­lungs­ma­schi­ne gegenüber GitHub au­then­ti­fi­ziert. Dies er­mög­licht schrei­ben­den Zugriff auf eigene Re­po­si­to­ries. Diese Methode funk­tio­niert auch mit GitHub-Al­ter­na­ti­ven wie Gitlab oder Bitbucket.

So praktisch SSH-Keys auch sind, muss man beim Umgang Vorsicht walten lassen. Geben Sie unter keinen Umständen den privaten Schlüssel weiter. Der private Schlüssel erlaubt u. U. einer anderen Partei, sich als man selbst aus­zu­ge­ben. In Ihrem Namen könnten sich Dritte auf einem Server einloggen oder Code in Re­po­si­to­ries ändern.

Vor­aus­set­zun­gen für Nutzung von mit SSH-Key GitHub

Wir setzen hier voraus, dass Sie unter einer Linux-artigen Umgebung arbeiten. Dazu zählen Linux/Unix, macOS, sowie Windows mit in­stal­lier­tem WSL2. Ferner müssen die folgenden Be­din­gun­gen erfüllt sein:

  • Git in­stal­liert
  • SSH in­stal­liert
  • GitHub-Konto angelegt

Über­prü­fen wir zunächst, ob die lokalen Vor­aus­set­zun­gen erfüllt sind. Mit dem folgenden Befehl testen wir, ob Git und SSH in­stal­liert sind. Sofern Sie keine Feh­ler­mel­dung „git not found“ oder „ssh not found“ erhalten, sind beide vorhanden:

which git ssh
bash

Ferner legen wir das .ssh-Ver­zeich­nis im Nut­zer­ord­ner an, falls es noch nicht existiert:

mkdir -vp ~/.ssh/
bash

Wir erklären im Folgenden, wie Sie einen SSH-Key für die Nutzung von GitHub anlegen und re­gis­trie­ren. Ist dieser Schritt ab­ge­schlos­sen, zeigen wir, wie Sie den öf­fent­li­chen SSH-Key bei GitHub hin­ter­le­gen und erklären den Zugriff auf Git-Re­po­si­to­ries über SSH:

  1. SSH-Schlüs­sel­paar auf dem eigenen System anlegen
  2. Öf­fent­li­chen SSH-Key bei GitHub hin­ter­le­gen
  3. Mit SSH-Key auf GitHub-Re­po­si­to­ry zugreifen

SSH-Key auf dem eigenen System anlegen und re­gis­trie­ren

Als ersten Schritt werden wir ein öf­fent­li­ches / privates SSH-Schlüs­sel­paar auf unserem lokalen System erzeugen. Kopieren Sie die dafür genutzten Befehle in der exakt gleichen Rei­hen­fol­ge und führen Sie diese auf Ihrer Kom­man­do­zei­le aus.

Wir halten uns hier an die of­fi­zi­el­le Do­ku­men­ta­ti­on von GitHub. Das Verfahren ändert sich von Zeit zu Zeit. Zum Beheben von SSH-Fehlern kann es also nicht schaden, dort nach­zu­schau­en.

Zunächst starten wir den SSH-Key Generator, um für GitHub ein öf­fent­li­ches / privates Schlüs­sel­paar zu erzeugen. Wir nutzen den ssh-keygen Befehl, welcher stan­dard­mä­ßig als Teil der OpenSSH-In­stal­la­ti­on auf dem System vorhanden ist:

Wir rufen ssh-keygen auf der Kom­man­do­zei­le auf und übergeben drei Optionen:

  • Option -f gefolgt von Pfad und Name des neuen Schlüs­sels
  • Option -t gefolgt vom Namen des Al­go­rith­mus, in diesem Fall ed25519
  • Option -C gefolgt von einer E-Mail­adres­se als Kommentar
ssh-keygen -f "$HOME/.ssh/github_id_ed25519" -t ed25519 -C "your_email@example.com"
bash
Hinweis

Sie können eine beliebige E-Mail­adres­se zur Erzeugung des Schlüs­sel­paars verwenden. Diese dient lediglich als Label; es muss sich nicht um dieselbe Adresse handeln, mit der Sie sich bei GitHub einloggen.

Der SSH keygen-Befehl fordert uns auf, eine „Pass­phra­se“ (zu Deutsch „Passsatz“) für den privaten Schlüssel fest­zu­le­gen. Anders als ein Passwort darf eine Pass­phra­se Leer­zei­chen enthalten. Die Pass­phra­se sollte mehrere Wörter lang sein und ist dann glei­cher­ma­ßen besser zu merken und schwer zu erraten. Für erhöhte Si­cher­heit baut man einige Ziffern oder Son­der­zei­chen mit ein. Geben Sie die Pass­phra­se ein und drücken Sie „Enter“. Wie­der­ho­len Sie den Prozess, um die Er­stel­lung des SSH-Schlüs­sel­paars ab­zu­schlie­ßen.

Tipp

Wir nutzen für unser Schlüs­sel­paar den Ed25519-Al­go­rith­mus. Tat­säch­lich ist eine ganze Reihe an Al­go­rith­men verfügbar. Wir stellen die Ver­schlüs­se­lungs­ver­fah­ren im Überblick in einem eigenen Artikel vor.

Bevor wir unseren frisch erzeugten SSH-Key mit GitHub nutzen können, führen wir einen weiteren Schritt durch. Dieser ist optional, wird jedoch dringend empfohlen. Wir fügen den privaten Schlüssel zum so­ge­nann­ten „SSH-Agent“ hinzu. Dabei handelt es sich um ein Hin­ter­grund­pro­gramm, welches auf dem lokalen System läuft. Führen Sie den folgenden Befehl auf der Kom­man­do­zei­le aus und geben Sie die Pass­phra­se ein, wenn Sie danach gefragt werden:

  • Windows / Linux
ssh-add ~/.ssh/github_id_ed25519
bash
  • macOS bis 11 Big Sur
ssh-add -K ~/.ssh/github_id_ed25519
bash
  • macOS ab 12 Monterey
ssh-add --apple-use-keychain ~/.ssh/github_id_ed25519
bash

Der SSH-Agent hat Zugriff auf hin­zu­ge­füg­te private Schlüssel und er­mög­licht, diese für Ver­bin­dun­gen zu nutzen, ohne jedes Mal die Pass­phra­se ein­zu­ge­ben. Doch der SSH-Agent kann noch mehr:

Zitat

„ssh-agent is a program that can hold a user's private key, so that the private key pass­phra­se only needs to be supplied once. A con­nec­tion to the agent can also be forwarded when logging into a server, allowing SSH commands on the server to use the agent running on the user's desktop.“ — Quelle: https://www.ssh.com/academy/ssh/keygen#adding-the-key-to-ssh-agent

Über­set­zung: „SSH-Agent ist ein Programm, welches private Schlüssel eines Nutzers vorhält, so dass die Pass­phra­se nur einmal ein­ge­ge­ben werden muss. Eine Ver­bin­dung zum SSH-Agenten lässt sich beim Einloggen in einen Server wei­ter­rei­chen. So können SSH-Befehle auf dem Server den SS­H­Agen­ten nutzen, welcher auf dem Ar­beits­rech­ner des Nutzers läuft.“ (übersetzt von IONOS)

SSH-Key bei GitHub hin­ter­le­gen

Wir haben ein SSH-Keypair auf unserem lokalen System erzeugt. Damit steht eine Hälfte der ver­schlüs­sel­ten Kom­mu­ni­ka­ti­on bei der Nutzung von Git über SSH. Der noch ver­blei­ben­de Schritt besteht darin, den öf­fent­li­chen SSH-Key bei GitHub zu hin­ter­le­gen.

Nun benötigen wir den Inhalt des öf­fent­li­chen Schlüs­sels. Wechseln Sie zu Ihrer lokalen Kom­man­do­zei­le und geben Sie den folgenden Befehl ein:

cat ~/.ssh/github_id_ed25519.pub
bash
Hinweis

Vorsicht: der Dateiname eines öf­fent­li­chen Schlüs­sels endet in .pub für „Public Key“. Jedoch endet der private Schlüssel nicht etwa in .priv, oder der­glei­chen. Statt­des­sen hat der private Schlüssel keine Endung. Teilen Sie aus­schließ­lich den Public Key-Key mit GitHub und sonstigen Dritten.

Mit SSH-Key auf GitHub-Re­po­si­to­ry zugreifen

Wir haben die Schlüssel lokal erzeugt und den öf­fent­li­chen SSH-Key auf GitHub hin­ter­legt. Testen wir zunächst, ob die Ver­bin­dung funk­tio­niert. Wir bedienen uns des folgenden Befehls:

ssh -T git@github.com
bash

Handelt es sich um den ersten Ver­bin­dungs­auf­bau mit GitHub von dieser Maschine aus, werden Sie zu­sätz­lich auf­ge­for­dert, den Server zu den „Known Hosts“ hin­zu­zu­fü­gen:

Beim Zugriff auf GitHub-Re­po­si­to­ries un­ter­schei­den wir zwischen lesendem und schrei­ben­dem Zugriff. Öf­fent­li­che Re­po­si­to­ries lassen sich von jedermann auslesen; dazu wird keinerlei Au­then­ti­fi­zie­rung, also auch kein SSH-Key benötigt.

Zum Her­un­ter­la­den eines Re­po­si­to­ry als lokale Kopie nutzt man den git clone-Befehl. Wir zeigen das bei­spiels­hal­ber am Re­po­si­to­ry des beliebten Netzwerk-Tools cURL. Wir besuchen die GitHub-Seite des öf­fent­li­che cURL-Re­po­si­to­ry und kopieren die Clone-URL:

Mit der Clone-URL aus­ge­stat­tet, wechseln wir zurück zur lokalen Kom­man­do­zei­le. Wir erzeugen einen Bei­spiel­ord­ner repo auf dem Desktop und wechseln zu diesem. Im Anschluss klonen wir das cURL-Re­po­si­to­ry, indem wir git clone mit der Clone-URL aufrufen:

cd ~/Desktop/
mkdir -p repo && cd repo
git clone https://github.com/curl/curl.git
bash

Wir wechseln in den cURL Re­po­si­to­ry-Ordner und zeigen mit dem git status-Befehl den Zustand des Re­po­si­to­ry an:

cd ~/Desktop/repo/curl/
git status
bash

Auch der git pull-Befehl, welcher ein Re­po­si­to­ry auf den neuesten Stand bringt, benötigt lediglich lesenden Zugriff. Wir führen Git-Pull im Re­po­si­to­ry-Ordner aus; prin­zi­pi­ell funk­tio­niert dies, auch wenn wahr­schein­lich noch keine Än­de­run­gen vorhanden sind:

git pull
bash

Nun versuchen wir, mit dem git push-Befehl auf das GitHub-Re­po­si­to­ry zu schreiben:

git push
bash

Was passiert hier? Die zum Klonen des öf­fent­li­chen cURL-Re­po­si­to­ry ver­wen­de­te Clone-URL beginnt mit HTTPS. Für unseren lokalen Klon ist dem­entspre­chend als „Origin“ („Ursprung“) eine HTTPS-URL hin­ter­legt. Wir über­prü­fen das Origin mit dem git show-Befehl:

git remote -v show
bash

Für lesenden Zugriff reicht eine HTTPS-URL, jedoch wird ein SSH-Key zum Schreiben auf GitHub-Re­po­si­to­ries benötigt. Denn die Au­then­ti­fi­zie­rung von Nut­ze­rin­nen und Nutzern per Username/Password wird auf GitHub seit August 2021 nicht mehr un­ter­stützt.

Um Git-Push dennoch testen zu können, wenden wir einen Trick an. Zunächst erzeugen wir auf GitHub ein eigenes, leeres Re­po­si­to­ry:

Den An­wei­sun­gen auf GitHub folgend ändern wir auf unserem System die Push-URL des lokalen cURL-Klons, so dass unser leeres GitHub-Re­po­si­to­ry als Origin verwendet wird. Ferner setzen wir den Branch auf „main“. Im Anschluss führen wir den Git-Push aus; die Operation schließt er­folg­reich ab und greift auf unseren vorher an­ge­leg­ten SSH-Key zurück, um uns gegenüber GitHub zu au­then­ti­fi­zie­ren.

git remote set-url origin git@github.com:<user>/test.git</user>
git branch -M main
git push -u origin main
bash

Mehrere SSH-Keys für ver­schie­de­ne GitHub-Konten verwenden

Es ist pro­blem­los möglich, nur einen SSH-Key für ver­schie­de­ne GitHub- oder sonstige Konten zu verwenden. Erinnern wir uns: den öf­fent­li­chen Schlüssel können wir be­den­ken­los teilen.

Technisch ist es durchaus möglich, eigene SSH-Keys für ver­schie­de­ne Services und Sites zu nutzen. Es bieten sich zwei Methoden an:

  1. SSH-Befehl mit Pa­ra­me­tern aufrufen
  2. SSH-Config-Datei anlegen

SSH-Befehle mit Pa­ra­me­tern fallen unter Umständen sehr lang aus, weshalb wir diesen Ansatz hier nicht zeigen. Generell ist es kom­for­ta­bler, mit einer SSH-Config-Datei zu arbeiten. Dies erfordert etwas mehr Aufwand bei der Kon­fi­gu­ra­ti­on des eigenen Systems, dieser muss jedoch nur einmalig geleistet werden. Hier ein Überblick der an der SSH-Kon­fi­gu­ra­ti­on be­tei­lig­ten Ordner und Dateien:

SSH-Kon­fi­gu­ra­ti­on Pfad Erklärung
Config-Ordner ~/.ssh/ Enthält SSH-Kon­fi­gu­ra­ti­on und Schlüs­sel­paa­re.
Private Key ~/.ssh/key-name Privater Schlüssel eines Schlüs­sel­paars.
Public Key ~/.ssh/key-name.pub Öf­fent­li­cher Schlüssel eines Schlüs­sel­paars.
Config-Datei ~/.ssh/config SSH-Kon­fi­gu­ra­ti­ons­da­tei.
Known Hosts ~/.ssh/known_hosts Liste mit in der Ver­gan­gen­heit ver­bun­de­nen Hosts.

Legen wir zunächst die SSH-Config-Datei an. Wir erzeugen die Datei, passen die Nut­zer­rech­te an und öffnen sie im Kom­man­do­zei­len-Editor:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
nano ~/.ssh/config
bash

An­schlie­ßend kopieren Sie den folgenden Block in den Editor und folgen Sie den Screen­shots zum Speichern der Datei:

# Github
Host github github.com
    HostName github.com
    User git
    IdentityFile "~/.ssh/github_id_ed25519"
    IdentitiesOnly yes

Nach dem Einfügen des GitHub-Kon­fi­gu­ra­ti­ons­blocks lässt sich eine SSH-Ver­bin­dung unter Angabe des fest­ge­leg­ten Host-Kürzels github aufbauen:

ssh -T github
bash

Fügen Sie dem dar­ge­stell­ten Schema folgend Kon­fi­gu­ra­ti­ons­blö­cke für weitere Dienste oder Konten in die SSH-Config-Datei ein. Hier die dabei zum Einsatz kommenden Parameter im Überblick:

Ein­stel­lung Erklärung Beispiel
Host Kann mehrere beliebige Namen enthalten. github.com github
HostName Hostname des ent­fern­ten Systems, auf dem SSH läuft; auch eine IP-Adresse lässt sich nutzen. github.com
User Git-Nutzer auf dem ent­fern­ten System; muss exakt über­nom­men werden. git
Iden­ti­ty­Fi­le Absoluter Pfad zum privaten Schlüssel. Passen Sie diesen an, falls Sie mehrere Schlüssel verwenden. ~/.ssh/github_id_ed25519
Iden­ti­tie­sOn­ly Legt fest, dass für diesen Host der Zugriff nur per Schlüssel erfolgen darf. yes

Noch ein Tipp zum Abschluss. Falls Sie SSH-Kon­fi­gu­ra­tio­nen für mehrere Hosts mit eigenen Schlüs­seln anlegen, sollten Sie am Ende der Datei einen Block mit Ein­stel­lun­gen für nicht auf­ge­führ­te Hosts hin­zu­fü­gen:

# For all hosts
Host *
IdentitiesOnly no
IgnoreUnknown UseKeychain, AddKeysToAgent
UseKeychain yes
AddKeysToAgent yes
bash

Dies erlaubt Zugriff ohne SSH-Schlüssel auf nicht spe­zi­fi­zier­te Hosts. So können Sie per SSH-Befehl mit ihrem Nut­zer­na­men eine Ver­bin­dung zu einem Host aufbauen und das Passwort beim Ver­bin­dungs­auf­bau eingeben:

ssh user@host
bash

Ohne die Zeile „Iden­ti­tie­sOn­ly no“ in der ab­schlie­ßen­den Kon­fi­gu­ra­ti­on probiert SSH nach­ein­an­der alle Schlüssel in ~./ssh/, um sich mit dem Server zu verbinden. Ist kein passender Schlüssel dabei, kommt es zum Fehler „Too many au­then­ti­ca­ti­on failures“.

Zum Hauptmenü