SSH-Key und das »Windows Subsystem for Linux«

Mit Bash on Ubuntu on Windows kann auf Windows 10 ein Windows Subsystem for Linux genutzt werden. Damit lassen sich viele Linux-Befehle auf Windows ausführen, wie beispieslweise auch ssh. Hier zeige ich euch, wie die Erstellung eines SSH-Keys abläuft, der im Subsystem und von Windows genutzt werden soll.

Zielsetzung

Ich wollte einen SSH-Key erstellen, den ich sowohl in dem Linux-Subsystem als auch von normalen Windows-Programmen aus nutzen kann. Im Optimalfall soll es den Key auf der Festplatte nur einmal geben. Wie ihr das Linux-Subsystem installieren könnt, zeigt ein Beitrag auf howtogeek.com.

Vermeintliche Lösung

Zunächst das erste Problem: Im Windows-Dateipfad wird der SSH-Key standardmäßig unter C:/Users/Florian/.ssh/ abgelegt, was im Linux-Subsystem dem Pfad /mnt/c/Users/Florian/.ssh/ entspricht. Standard-Ort für einen SSH-Key im Subsystem ist ~/.ssh/.

Nach ein bisschen Suchen bin ich in einer Stack-Exchange-Antwort auf die vermeintlich einfache Lösung gestoßen, einen Symlink anzulegen, sodass ~/.ssh/ auf C:/Users/Username/.ssh/ zeigt. Gesagt, getan. Anschließend Schlüssel generiert und getestet. Ergebnis war eine Meldung, dass die Dateiberechtigung des privaten Schlüssels zu offen sei, sodass der SSH-Befehl den Schlüssel ignoriert. Bei der Änderung der Berechtigungen bin ich dann gescheitert – die Berechtigungen lassen sich im Subsystem innerhalb des C-Verzeichnisses nicht ändern und über die Kommandozeile von Windows hatte ich auch keinen Erfolg.

Funktionierende Lösung

Nun etwas ausführlicher die Lösung, die für mich funktioniert. Wegen der Berechtigungsprobleme muss der Schlüssel doch zweimal existieren: Einmal in ~/.ssh/ und einmal in /mnt/c/Users/Florian/.ssh/. Wir generieren also zunächst aus dem Subsystem heraus einen neuen Key mit dem folgenden Befehl (ich habe die Bash-Shell da als Admin ausgeführt, ist aber vermutlich nicht notwendig):

ssh-keygen -t rsa -b 4096

Wir drücken Enter, wenn wir nach der Eingabe eines Speicherortes gefragt werden, um das Standard-Verzeichnis und den Standard-Namen zu verwenden. Anschließend vergeben wir eine Passphrase und haben den Schlüssen erstellt.

Nun kopieren wir den privaten und öffentlichen Schlüssel in das Windows-SSH-Verzeichnis:

cp ~/.ssh/. -R /mnt/c/Users/Florian/.ssh/

Wenn wir uns nun mit einem SSH-Server verbinden, bekommen wir beim ersten Mal den Fingerprint des Servers angezeigt, um zu prüfen, ob es auch der richtige ist. Wenn wir das bestätigen, wird im SSH-Verzeichnis eine Datei known_hosts erstellt oder aktualisiert. Dadurch wird bei der nächsten Verbindung mit dem Server nicht mehr gefragt, ob ihr euch wirklich verbinden möchtet, da der Host bekannt ist.

Wenn ihr euch nun beispielsweise einmal über die Git-Shell für Windows mit einem Server verbindet, und anschließend über das Subsystem auf denselben Server zugreifen wollt, müsst ihr zweimal bestätigen, dass ihr euch verbinden möchtet, da es ja zwei unterschiedliche known_hosts-Dateien gibt. Wenigstens das können wir verhindern, indem wir einen Symlink von ~/.ssh/known_hosts auf /mnt/c/Users/Florian/.ssh/known_hosts zeigen lassen, sodass auch das Linux-Subsystem auf die Datei im Windows-SSH-Verzeichnis zugreift.

Dafür gebt ihr folgende Zeile im Subsystem ein:

ln -s /mnt/c/Users/Florian/.ssh/known_hosts ~/.ssh/known_hosts

Das wäre es dann auch schon. Nicht die schönste Lösung, da die Key-Dateien zweimal existieren müssen, aber verschmerzbar. Falls jemand von euch eine Lösung hat, bei der die Schlüssel nur einmal auf der Festplatte liegen, schreibt gerne einen Kommentar! 🙂

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.