Git-Anmeldung mit SSH

Gitlab schlägt ziemlich deutlich vor, die Anmeldung mittels SSH zu machen:
Gitlab fordert SSH Key



Einige der beschriebenen Befehle sind dieser Seite entnommen: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement


Vorraussetzungen

Windows

Installation

Es wird der OpenSSH-Client verwendet, der in Windows 10 und 11 als optionales Feature installierbar ist. Dazu unter "System" den Punkt "Optionale Features" aufrufen:
Optionale Features (1)
Dort auf "Features anzeigen" klicken:
Optionale Features (2)

Auf "Verfügbare Features anzeigen" klicken:
Optionale Features (3)

Den "OpenSSH Client" auswählen und auf "Hinzufügen" klicken:
Optionale Features (4)


Nacharbeiten

Nach der Installation muss der Dienst "OpenSSH-Agent" gestartet werden. Dieser ist in Windows per Default nicht gestartet.
OpenSSH-Agent starten

Zuerst muss man ihn bearbeiten und den Starttyp von "Deaktiviert" auf "Manuell" ändern:
OpenSSH-Agent starten

Danach kann man den Dienst starten.


Linux

Hier dürften alle Komponenten vorhanden sein.


Key initialisieren

Schritt 1: Key erzeugen (Default Key):

Ich beschriebe hier zwei Wege:
a) Default-Key erzeugen und verwenden
b) Benannten Key erzeugen, so dass man mehrere SSH-Keys parallel verwenden kann

Standardvariante: Default-Key

Diese Variante sollte man nur verwenden, wenn keine weiteren SSH-Keys benötigt werden.

Der folgende Befehl erzeugt einen Key mit dem Algorithmus "Ed25519", der aktuell empfohlen wird:

ssh-keygen -t ed25519

Man kann einen Passphrase eingeben, den man sich gut merken sollte. Wird der Passphrase leer gelassen, ist es eventuell nicht nötig, den Private Key im OpenSSH-Agent zu hinterlegen, aber wir wollen ja nach aktuellem Stand der Sicherheit arbeiten ;-).

Ausgabe:

C:\Temp\gitlab>ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\USERNAME/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\USERNAME/.ssh/id_ed25519.
Your public key has been saved in C:\Users\USERNAME/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx USERNAME@RECHNERNAME
The key's randomart image is:
+--[ED25519 256]--+
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
+----[SHA256]-----+

Alternativ: benannten Key erzeugen

Diese Variante sollte verwendet werden, wenn weitere SSH-Keys für andere Anwendungsfälle verwendet werden.
Der Key wird mit dem gleichen Befehl erzeugt wie oben. Allerdings wird während der Generierung ein abweichender Pfad bzw. Schlüsselname angegeben (hier: "C:\Users\USERNAME\.ssh\gitlab").

C:\>ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\USERNAME/.ssh/id_ed25519): C:\Users\USERNAME\.ssh\gitlab
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\USERNAME\.ssh\gitlab.
Your public key has been saved in C:\Users\USERNAME\.ssh\gitlab.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx USERNAME@RECHNERNAME
The key's randomart image is:
+--[ED25519 256]--+
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
|...              |
+----[SHA256]-----+

Der Pfad sollte immer im Userprofil liegen, da "ssh-add" andere Pfade verbietet. Folgendes passierte bei mir, nachdem ich einen Key an einem anderen Pfad speichern wollte:

Permissions for 'C:\irgendein\pfad\gitlab' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

Hinweis: Windows und WSL

Von Hr. Hinkel kam dieser Hinweis: um WSL und Windows verwenden, braucht es zwei verschiedene Keys, einen für Windows und einen für WSL. Es soll nicht versucht werden, denselben Key für beide Systeme zu verwenden. Es kann aber derselbe Key sowohl für GitLab als auch für andere GitLabs oder GitHub verwenden werden, das geht ohne Probleme.

Schritt 2: Key in Gitlab registrieren

Man geht links oben auf das Benutzerlogo, dann auf "Edit Profile":


Edit Profile



Unter "SSH Keys" fügt man den Public Key (Inhalt der Datei "id_ed25519.pub") ein:
SSH Key in Gitlab registrieren

Schritt 3: Key im ssh-agent registrieren

Windows

Hier muss der Key nur einmalig registriert werden, der Passphrase bleibt über Rechnerneustarts hinweg erhalten.

ssh-add c:\Users\USERNAME\.ssh\id_ed25519

Ausgabe:

Enter passphrase for c:\Users\USERNAME\.ssh\id_ed25519:
Identity added: c:\Users\USERNAME\.ssh\id_ed25519 (USERNAME@RECHERNAME)

Kommt hier ein Fehler "Could not open a connection to your authentication agent.", dann ist der SSH-Dienst nicht gestartet.

Linux

Dies muss nach jedem Rechner-Neustart einmalig geschehen, der Key wird nicht dauerhaft gespeichert.

ssh-add ~/.ssh/id_ed25519

Ausgabe:

Enter passphrase for /home/USERNAME/.ssh/id_ed25519: 
Identity added: /home/USERNAME/.ssh/id_ed25519 (USERNAME@RECHERNAME)

Troubleshooting:

Es kann diese Meldung kommen:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/USERNAME/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

Lösung: hier müssen die Rechte so gesetzt werden, dass keine Leserechte für andere User bestehen:

chmod  400 ~/.ssh/id_ed25519

Bei mir kam bei der ersten Verwendung diese Fehlermeldung:

Could not open a connection to your authentication agent.

Sie besagt, dass der "ssh-agent" nicht läuft.

Der "ssh-agent" muss dann mit diesem Befehl gestartet werden:

eval `ssh-agent`

Ein reiner Aufruf von "ssh-agent" reichte nicht aus.

Bei meinem ersten Versuch war dieser Aufruf in jeder neu geöffneten Shell nötig. Nach einem Rechner-Reboot startete er allerdings automatisch.

Alternative: Benannter Key

Wie oben: man gibt den Pfad zum Key an.

ssh-add c:\Users\USERNAME\.ssh\gitlab

Zusätzlich muss man diesen Key an das Repository "gitlab.cs.hs-rm.de" binden. Ansonsten werden evtl. andere Keys verwendet, und die Anmeldung schlägt fehl. Dazu die Datei "C:\Users\USERNAME\.ssh\config" anlegen mit diesem Inhalt:

Host gitlab.cs.hs-rm.de
HostName gitlab.cs.hs-rm.de
IdentityFile "C:\Users\USERNAME\.ssh\gitlab"

Key verwenden

Auf Git zugreifen

Das Clonen des Repositories kann mit diesem Befehl erfolgen:

git clone git@gitlab.cs.hs-rm.de:USERNAME/REPOSITORYNAME.git

Hier muss man die Passphrase für den SSH Key angeben, den man bei der Generierung vergeben hat (außer man hätte das "core.sshCommand" global gesetzt).

(Windows) Git mitteilen, dass es den Windows-SSH-Befehl verwenden soll

Nach dem Clone ins Verzeichnis des Repositories wechseln und folgenden Befehl ausführen:

git config core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"

Achtung: der Pfad enthält wirklich die Linux-Slashes, keine Windows-Backslashes! Mit letzteren gibt es Syntaxfehler.

Dieser Befehl gilt nur für das aktuelle Repository, muss also für jedes Repository erneut ausgeführt werden. Alternativ kann auch der Befehl "git config --global core.sshCommand ..." verwendet werden, der die Einstellung rechnerweit setzt. Ich denke dies ist hier vertretbar, da es vermutlich keinen Grund gibt, unterschiedliche SSH-Versionen in unterschiedlichen Git-Repositories zu verwenden.

Zusatzinfos

Keys anzeigen

Mit folgendem Befehl kann man sich die im SSH Agent registrierten Keys anzeigen lassen:

ssh-add -l

Etwas mehr Infos erhält man mit:

ssh-add -L

Key löschen

Mit folgendem Befehl wird der Key am übergebenen Pfad aus dem SSH Agent entfernt:

ssh-add -d "c:\Users\USERNAME\.ssh\gitlab"

SSH-Diagnose

Mit diesem Befehl kann eine Testanmeldung an Gitlab durchgeführt werden. Durch den Zusatz "-v" werden Diagnoseinformationen angegeben, und man sieht zum Beispiel, welche Key-Datei verwendet wird.

ssh -T git@gitlab.cs.hs-rm.de -v