Mal abgesehen von der Tatsache, dass Apple bis heute keine -sk Keys unterstützt, gibt es eine weitere Sache, die mich im Umgang mit SSH Keys stört. Seit dem Wechsel von bash auf zsh, werden die Keys nicht mehr automatisch geladen bzw. zum Agent hinzugefügt.
Ärgernis
Das ist ein sehr großes Ärgernis für Leute wie mich, die viel mit SSH als auch mit git arbeiten. macOS hat keinen cron, den man hierfür missbrauchen könnte, sondern nur sogenannte LaunchAgents. Einen entsprechenden hatte ich mir gebaut, der zum Systemstart ein ssh-add --apple-load-keychain
ausführt. Einen LaunchAgent habe ich gewählt, damit ich das Terminal direkt ready habe, da er im Anmeldevorgang bereits läuft.
LaunchAgent
Wie nach jeder großen Major-Version von Apple benötigte dieser LauchAgent ständige Anpassung, bis er dann mit Version 13 »Ventura« endgültig versagte. Meinen Ärger über solche Kleinigkeiten, die nicht funktionieren, kann ich kaum in Worte fassen. Benutzen deren Dev’s etwa kein SSH, eat your own dogfood scheint dort nicht der Fall zu sein.
Gescriptet
Jedenfalls musste eine Lösung her, die die SSH Keys lädt als auch das Autocomplete meiner .ssh/config
ermöglicht und die Hosts auto-vervollständigt. Im ersten Schritt kopieren wir die SSH Keys in das richtige Verzeichnis:
cp /path/to/keys ~/.ssh
Danach fügen wir die Passphrase zur macOS Keychain hinzu:
ssh-add --apple-use-keychain .ssh/mykey
Wir frisieren die SSH config mit einem Texteditor unserer Wahl (nicht nano, den hat Apple auch ausgebaut…)
Host *
UseKeychain yes
IgnoreUnknown UseKeyChain
AddKeysToAgent yes
Die Keys wurden zum Agenten als auch der Keychain hinzugefügt und sind einsatzbereit. Allerdings nur bis zum nächsten Neustart (oder Beenden der Session des aktuellen Benutzers). Genau das ist mein Aufreger der Woche.
Nachdem auch die LaunchAgents nicht mehr funktionieren, geht das halt nun per Shell:
vim /home/USERNAME/.zshrc
# Autocomplete Befehle und SSH Hosts
autoload -Uz compinit && compinit -i
# Lade die Keys
if [ -z "$SSH_AUTH_SOCK" ] && [ -z "$SSH_AGENT_PID" ]; then
# If no SSH Agent is running, start one and load keys from Apple keychain
eval `ssh-agent -s` &> /dev/null
ssh-add --apple-load-keychain &> /dev/null
else
if [ -z "$(ssh-add -l | grep SHA256)" ]; then
# If agent is running but has no keys, load keys from Apple keychain
ssh-add --apple-load-keychain &> /dev/null
fi
fi
Nach einem Neustart/Abmelden des Benutzers wird dies bei jedem Start des Terminals ausgeführt. Nur das erste Mal nach Neustart dauert dies, je nach Anzahl der Keys, etwas länger (müssen ja erst zum Agent hinzugefügt werden). Die Keys sind geladen und das OS kann sich nicht mehr dagegen wehren, so wie mit der LaunchAgent-Methode.
Linux kann’s besser
Etwas Nachtreten lasse ich mir nicht nehmen: Linux kann das out of the box. Apple stellt sich immer als anwenderfreundlich dar. Ist das wirklich anwenderfreundlich? Zugegeben, es ist ein Pro-User-Fall, aber dennoch hätte es vor ein paar Major-Versionen beim Wechsel von bash auf zsh auffallen MÜSSEN. Spätestens einem internen Entwickler nach Release. Als jemand, der gezwungen ist, mit drei Betriebssystemen zu arbeiten, finde ich solche »Schlampereien« nur bei macOS und Windows. Die »Großen« sollten sich da mal eine Scheibe von Debian und RedHat abschneiden, da würde es so etwas nicht geben.