Die ssh-Konfiguration einrichten
Tragen Sie dies in ~/.ssh/config ein:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
- UseKeychain yes sucht die Passphrase im Schlüsselbund, wenn ein Schlüssel verwendet wird, und speichert sie dort, nachdem Sie sie richtig eingegeben haben.
- AddKeysToAgent yes fügt den Schlüssel bei der ersten Verwendung dem laufenden Agent hinzu, sodass er für spätere Verbindungen entsperrt bleibt.
- IdentityFile benennt den Schlüssel. Ohne diese Zeile probiert ssh trotzdem die Standardnamen.
Eine Schlüsseldatei ohne Passphrase hat nichts zu speichern. Hat Ihre keine, fügen Sie zuerst mit ssh-keygen -p -f ~/.ssh/id_ed25519 eine hinzu.
Noch keinen Schlüssel? Siehe wie Sie einen Ed25519-SSH-Schlüssel erzeugen, und vergeben Sie dabei eine Passphrase.
Die Passphrase speichern
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
Geben Sie die Passphrase einmal ein. Prüfen Sie dann, ob der Agent den Schlüssel hält:
ssh-add -l
Es listet den Fingerprint jedes geladenen Schlüssels auf und meldet The agent has no identities., wenn es keine gibt.
Sie müssen den Agent nicht selbst starten. Unter macOS startet launchd ssh-agent bei Bedarf für Ihre Sitzung, und SSH_AUTH_SOCK zeigt bereits darauf. Tragen Sie eval "$(ssh-agent)" nicht in Ihr Shell-Profil ein: Das startet in jeder Shell einen eigenen Agent.
Nach einem Neustart
Der Agent startet nach einem Neustart leer, aber die Passphrase liegt weiterhin im Schlüsselbund. Mit der obigen Konfiguration liest Ihre erste ssh-Verbindung sie von dort und lädt den Schlüssel in den Agent. Um stattdessen alle gespeicherten Schlüssel auf einmal zu laden:
ssh-add --apple-load-keychain
Apple hat dieses Verhalten in macOS 10.12.2 geändert. Ältere Anleitungen gehen womöglich davon aus, dass Schlüssel sich von selbst laden. Werden Sie immer wieder nach der Passphrase gefragt, prüfen Sie, ob AddKeysToAgent yes und UseKeychain yes beide gesetzt sind.
Die alten Optionen -K und -A
Ältere Anleitungen verwenden ssh-add -K und ssh-add -A. Laut Apples Handbuchseite wurden sie in --apple-use-keychain und --apple-load-keychain umbenannt. In manchen Fällen funktionieren sie noch, aber im Standard-OpenSSH bedeutet -K etwas anderes, im Zusammenhang mit Hardware-Schlüsseln. Verwenden Sie die langen Namen.
Wenn Sie ein anderes ssh auf demselben Mac nutzen
UseKeychain gibt es nur in dem ssh, das Apple mitliefert. Andere Builds, etwa von Homebrew oder von einem Linux-Rechner, der Ihre Dotfiles teilt, brechen mit diesem Fehler ab:
Bad configuration option: usekeychain
Um eine Konfiguration für alle zu behalten, sagen Sie ssh, dass es die Option ignorieren soll, wo sie unbekannt ist. Das muss vor der Zeile stehen, die sie verwendet:
IgnoreUnknown UseKeychain
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
Um zu sehen, welches Sie gerade ausführen:
which ssh
ssh -V
Apples Build liegt in /usr/bin/ssh. Die Optionen mit --apple- gibt es ebenfalls nur in Apples /usr/bin/ssh-add.
Zu viele Schlüssel: IdentitiesOnly
Standardmäßig bietet ssh jeden Schlüssel im Agent an, dazu die konfigurierten Dateien. Bei mehreren Schlüsseln kann das in Too many authentication failures enden und verrät jedem Server Schlüssel, die er nicht zu sehen braucht. Beschränken Sie einen Host auf einen Schlüssel:
Host server
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
IdentitiesOnly yes schaltet den Agent nicht ab. Hält der Agent den genannten Schlüssel, nutzt ssh ihn weiterhin von dort, und die Passphrase wird nicht erneut abgefragt. IdentityFile kann sogar auf die .pub-Datei zeigen, wenn der private Schlüssel nur im Agent liegt.
Einen Schlüssel entfernen oder begrenzen
ssh-add -d ~/.ssh/id_ed25519 # remove one key from the agent
ssh-add -D # remove all keys from the agent
ssh-add --apple-use-keychain -d ~/.ssh/id_ed25519 # remove from the agent and the Keychain
ssh-add -t 3600 ~/.ssh/id_ed25519 # keep the key loaded for one hour
Das einfache -d und -D leeren nur den Agent. Mit UseKeychain yes liegt die Passphrase weiterhin im Schlüsselbund, und der Schlüssel kommt bei Ihrer nächsten Verbindung zurück.
Jeder, der auf einem entsperrten Mac als Sie angemeldet ist, kann die Schlüssel im Agent nutzen, ebenso jedes Programm, das Sie ausführen. Wenn Sie das beunruhigt, verwenden Sie AddKeysToAgent confirm, damit jede Nutzung bestätigt werden muss, beachten Sie aber, dass dies ein funktionierendes SSH_ASKPASS-Programm braucht. Überlegen Sie sich auch gut, ob Sie Agent-Weiterleitung nutzen: siehe die Risiken der Agent-Weiterleitung.
Fragen
Warum fragt mein Mac immer wieder nach der Passphrase meines SSH-Schlüssels?
Meist fehlt AddKeysToAgent yes oder UseKeychain yes in ~/.ssh/config. Tragen Sie beide ein und führen Sie einmal ssh-add --apple-use-keychain mit Ihrem Schlüssel aus.
Funktioniert ssh-add -K unter macOS noch?
Apple hat es in --apple-use-keychain umbenannt und -A in --apple-load-keychain. Im Standard-OpenSSH bedeutet -K etwas anderes, das mit Hardware-Schlüsseln zu tun hat. Nutzen Sie also die langen Namen.
Wie sehe ich, welche Schlüssel ssh-agent hält?
Führen Sie ssh-add -l aus. Es zeigt den Fingerabdruck jedes geladenen Schlüssels, oder The agent has no identities., wenn er leer ist.
Quellen
- Apple Technical Note TN2449, OpenSSH updates in macOS 10.12.2
- ssh_config(5), OpenBSD manual
- ssh-add(1), OpenBSD manual
- ssh-agent(1), OpenBSD manual