macOS Sierra scheint sich zwischen Neustarts keine SSH-Schlüssel zu merken

185

Ich muss diesen Befehl seit dem Upgrade auf macOS ausführen:

ssh-add -K

Behebt das Problem nach dem Neustart, aber ich muss diesen Befehl jedes Mal ausführen, wenn ich mich an meinem Computer anmelde.

Wenn ich den obigen Befehl nicht ausführe, werden meine Eingaben ~/.sshübersprungen und ich werde nach dem Serverkennwort gefragt, um die Verbindung herzustellen.

bisherbas
quelle
1
$ ssh-add -Kgibt mirssh-add: illegal option -- K
modius
1
Danach müssen Sie den Pfad des privaten Schlüssels eingeben -K. Eine Lösung finden Sie in der Antwort von @JakeGould.
bisherbas
Das 10.12.2-Update hat einige unnötige Server-Passwortanforderungen für mich beseitigt. Möglicherweise müssen Sie jetzt ssh-add -K nicht mehr ausführen.
Wayfaring Stranger

Antworten:

216

Ab macOS Sierra 10.12.2 hat Apple eine ssh_configOption namens hinzugefügt , UseKeychaindie eine "richtige" Lösung für das Problem ermöglicht. Fügen Sie Ihrer ~/.ssh/configDatei Folgendes hinzu :

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Von der ssh_config manSeite am 10.12.2:

UseKeychain

Gibt unter macOS an, ob das System nach Passwörtern im Schlüsselbund des Benutzers suchen soll, wenn versucht wird, einen bestimmten Schlüssel zu verwenden. Wenn die Passphrase vom Benutzer bereitgestellt wird, gibt diese Option auch an, ob die Passphrase im Schlüsselbund gespeichert werden soll, nachdem überprüft wurde, ob sie korrekt ist. Das Argument muss "Ja" oder "Nein" sein. Der Standardwert ist "Nein".

mluisbrown
quelle
2
Laut diesem Link: openradar.appspot.com/27348363 Apple hat "sein Verhalten mit dem Mainstream-OpenSSH in diesem Bereich neu ausgerichtet".
ThomasW
15
Es ist absurd, dass Apple das Verhalten in einer Weise geändert hat, die den meisten Entwicklern Probleme bereitet (wegen GitHub-Push, wenn nicht anders) und niemandem etwas gesagt hat!
mluisbrown
9
Ich halte das IdentityFile ~/.ssh/id_rsafür überflüssig und nicht erforderlich (wenn man sich die Standardoptionen ansieht). Ich habe diese Option noch nie in meiner ssh-Konfigurationsdatei festgelegt.
Therealmarv
9
Das Ändern von @JakeGould IMO ~/.ssh/config~ist vorzuziehen, da es das Problem auf der sshEbene löst . Nicht 100% sicher, dass der .bash_profileMod für GUI-Clients mit ssh ohne Shell funktioniert.
mluisbrown
7
Apple hat den Technical Note TN2449 zu dieser Änderung veröffentlicht.
Kentzo
107

Ich hatte dieses Problem auch, als ich versuchte, Code mit Capistrano bereitzustellen . Sehr frustrierend. Ich kenne zwei Methoden, um dieses Problem zu lösen.

Methode 1: Fügen Sie dem SSH-Agenten alle bekannten Schlüssel hinzu.

Eine Lösung, die ich gefunden habe, ist die Ausführung ssh-addmit der -AOption, die dem SSH-Agenten alle bekannten Identitäten hinzufügt, wobei alle in Ihrem Schlüsselbund gespeicherten Passwörter verwendet werden:

ssh-add -A

Das funktioniert jetzt, bleibt aber nach einem Neustart nicht erhalten. Wenn Sie sich also nie wieder darum kümmern möchten, öffnen Sie einfach die ~/.bash_profileDatei Ihres Benutzers wie folgt:

nano ~/.bash_profile

Und füge diese Zeile unten hinzu:

ssh-add -A 2>/dev/null;

Wenn Sie jetzt ein neues Terminalfenster öffnen, sollte alles in Ordnung sein!

Methode 2: Fügen Sie dem Agenten nur SSH-Schlüssel hinzu, die sich im Schlüsselbund befinden .

Während die ssh-add -AOption für die meisten einfachen Fälle funktionieren sollte, stieß ich kürzlich auf ein Problem, bei dem 6-7 Vagrant-Boxen (die SSH-Schlüssel / -Identitäten für den Zugriff verwenden) auf einem Computer eingerichtet wurden, zusätzlich zu den am häufigsten verwendeten id_rsa.pub.

Kurz gesagt, ich wurde aufgrund zu vieler fehlgeschlagener Versuche, die auf SSH-Schlüsseln / -Identitäten basierten, von einem Remote-Server gesperrt, da der Serverzugriff auf einem Kennwort beruhte und SSH-Schlüssel / -Identitäten SSH-Schlüssel / -Identitäten sind. Also hat der SSH-Agent alle meine SSH-Schlüssel ausprobiert , ist fehlgeschlagen und ich konnte nicht einmal zur Passwortabfrage gelangen.

Das Problem ist, dass ssh-add -Ajeder einzelne SSH-Schlüssel / jede einzelne SSH-Identität willkürlich zum Agenten hinzugefügt wird, auch wenn dies nicht erforderlich ist. wie im Fall von Vagrant-Boxen.

Meine Lösung nach vielen Tests war wie folgt.

Wenn Sie Ihrem Agenten mehr SSH-Schlüssel / -Identitäten hinzugefügt haben, als Sie benötigen, ssh-add -llöschen Sie sie zunächst wie folgt aus dem Agenten:

ssh-add -D

Danach starten Sie den SSH-Agenten wie folgt als Hintergrundprozess:

eval "$(ssh-agent -s)"

Jetzt wird es komisch und ich bin mir nicht sicher warum. In einigen Fällen können Sie ~/.ssh/id_rsadem Agenten den Schlüssel / die Identität wie folgt hinzufügen :

ssh-add ~/.ssh/id_rsa

Geben Sie Ihre Passphrase ein, drücken ReturnSie und los geht's.

In anderen Fällen reicht es jedoch aus, dies auszuführen, um den Schlüssel / die Identität hinzuzufügen:

ssh-add -K

Wenn das alles geklappt hat, geben ssh-add -lSie ein und Sie sollten einen einzigen SSH-Schlüssel / eine Identität sehen.

Alles gut? Jetzt öffne dein .bash_profile:

nano ~/.bash_profile

Und füge diese Zeile unten hinzu; kommentiere oder entferne die -AVersion, wenn du das hast:

ssh-add -K 2>/dev/null;

Dadurch kann der SSH-Schlüssel / die SSH-Identität bei jedem Start / Neustart erneut auf den SSH-Agenten geladen werden.

UPDATE: Apple hat jetzt eine UseKeychainOption zu den offenen SSH-Konfigurationsoptionen hinzugefügt und zieht auch ssh-add -Aeine Lösung in Betracht .

Ab macOS Sierra 10.12.2 hat Apple eine UseKeychainKonfigurationsoption für SSH-Konfigurationen hinzugefügt. Das Überprüfen der Manpage (via man ssh_config) zeigt die folgenden Informationen:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

Was darauf hinausläuft, dass Apple die Lösung entweder wie in diesem Open Radar-Ticket erläutertssh-add -A zu Ihrer hinzufügt oder als eine der Optionen in einem pro Benutzer hinzufügt ..bash_profile UseKeychain~/.ssh/config

JakeGould
quelle
4
@modius: Wenn Sie einen pw-geschützten Schlüssel haben, ssh-add -K [path to key]geben Sie pw ein, wenn Sie dazu aufgefordert werden. Der Schlüsselbund speichert das Passwort und ssh-add erhält es danach von dort.
Timo
2
Hinweis: Mit -A können Sie dem Agenten Identitäten hinzufügen, indem Sie in Ihrem Schlüsselbund gespeicherte Passwörter verwenden. Wenn Sie zusätzlich Identitäten ohne Passphrasen haben, müssen Sie die Option -A weglassen, um sie Ihrem Agenten hinzuzufügen.
Evan Pon
12
Um dies ein bisschen sichtbarer zu machen, hat Apple die Manpage für ssh_config so aktualisiert, dass sie Ihre Schlüssel aus ssh_config enthält UseKeychainund AddKeysToAgentautomatisch hinzufügt. Kein Shell-Scripting erforderlich. Die aktualisierten Informationen für 10.12.2
Ryan Gibbons,
1
@JakeGould Ich verstehe, was du sagst, ich mag eigentlich, was sie tun. Anstatt die Passphrase automatisch im Schlüsselbund zu speichern und beim Booten zu laden, haben Sie die Kontrolle über Ihre Sicherheit. / Achselzucken
Ryan Gibbons
1
@ RyanGibbons FWIW, sehen Sie sich den offiziellen Vorschlag von Apple Developer Relations in dieser Antwort auf OpenRadar an: "Sie können dies ziemlich einfach beheben, indem Sie ssh-add -Ain Ihrem RC-Skript ¯\_(ツ)_/¯
ausführen,
16

Wie hier erklärt , ist dies die empfohlene Methode seit macOS 10.12.2 :

  1. Fügen Sie Ihrer ~/.ssh/configDatei die folgenden Zeilen hinzu :

    Host *
        UseKeychain yes
        AddKeysToAgent yes
  2. Jeder Schlüssel, den Sie mit dem Befehl zum ssh-agent hinzufügen, ssh-add /path/to/your/private/key/id_rsawird automatisch zum Schlüsselbund hinzugefügt und sollte beim Neustart automatisch geladen werden.


Ich füge diese Antwort hinzu, weil:

  • Andere Antworten fordern Sie auf, die IdentityFile ~/.ssh/id_rsaZeile hinzuzufügen , aber diese Option wird zum automatischen Laden der Schlüssel nicht benötigt (und bindet tatsächlich diesen bestimmten Schlüssel für den Host-Abschnitt, dem Sie ihn hinzufügen, an den Sie nicht möchten, wenn Sie andere Schlüssel verwenden verschiedene hots).
  • Die akzeptierte Antwort erwähnt UseKeychain, aber das reicht nicht aus, um die Schlüssel ssh-agentnach einem Neustart beizubehalten.
Ricardo Sanchez-Saez
quelle
1
Zum zweiten Punkt. Wie sicher bist du dir? Beim Neustart passiert eigentlich nichts und es wird auch nicht in Ihrem Referenzmaterial erwähnt. Was mit der obigen Konfiguration passiert ist, dass Ihr SSH-Client den Schlüssel bei der ersten Verbindung in den Agenten lädt (und auch die Passphrase vom Schlüsselbund abruft), dann bleibt der Schlüssel geladen. Sie können durch die Auflistung der Schlüssel direkt nach dem Neustart diese Aussage überprüfen , über ssh-add -Lund es wird berichten The agent has no identities. Nichts wird da sein, bis Sie eine Verbindung herstellen. Die AddKeysToAgentSchlüssel bleiben in keiner Weise zwischen Neustarts erhalten!
Danila Vershinin
15

Ich habe einen kurzen Beitrag zu diesem Thema geschrieben , der Ihnen helfen könnte.

Eine Lösung ruft ssh-add -Abei jedem Start den Befehl auf.

Fügen Sie einfach eine .plistDatei mit dem folgenden Inhalt zum Pfad hinzu ~/Library/LaunchAgents/oder erstellen Sie eine mit der Lingon- App:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->
Jirsbek
quelle
8

Seit macOS 10.12.2 können Sie die UseKeychainOption verwenden. Lesen Sie hier mehr oder schauen Sie rein man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

Also mach einfach folgendes:

echo "UseKeychain yes" >> ~/.ssh/config

Ben
quelle
1
Die Verwendung >>ist gefährdet, wenn Sie den Befehl mehrmals eingeben. Mach lieber eine manuelle Ausgabe der Datei, wie von mluisbrown answer oder ChrisJF answer beschrieben .
Cœur
Sie sind genau dort :-)
Ben
4

Ich fand, dass ssh-add -Kgab mir " illegale Option - K ". Dies lag daran, dass ssh-add eine seltsame Version von / usr / local / bin war (von brew installiert?). Ich konnte den Schlüssel mithilfe des Befehls ssh-add in / usr / bin hinzufügen:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
Fiskabollen
quelle
Das ist es, was für mich funktioniert hat, nachdem ich lange Zeit nicht mehr so ​​einfach gearbeitet habe.
Nyxee
4

Ich hatte dieses Problem schon einmal und habe einen Weg gefunden, dies zu umgehen. Ich habe gerade eine Datei mit dem Namen configin meinem ~/.sshOrdner erstellt, in der ich die folgenden Zeilen eingefügt habe:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

Ich bin nicht sicher warum, aber Hostund HostNamebeide sind wichtig. In meinem Fall hat die Lösung nicht funktioniert, wenn einer von ihnen nicht anwesend war.

Dann habe ich einfach eine gemacht ssh-add -Kund es hat auch nach dem Neustart funktioniert.

Unendlichkeit
quelle
1
Host ist Ihr benutzerdefinierter Name / Alias ​​für einen bestimmten Server und grenzt Einträge pro Server ab. Stilistisch ist es hilfreich, die Zeilen, die auf den Host-Eintrag folgen, einzurücken. Hostname gibt den netzwerkadressierbaren Namen des Servers wie github.com an, Sie können jedoch auch eine IP-Adresse verwenden. Host und HostName müssen nicht dasselbe sein, aber ja, beide sind fester Bestandteil des ssh-Konfigurationsformats.
Mark Fox
4

Wenn Sie eine andere Version von ssh verwenden (z. B. über Homebrew installiert), funktionieren die oben genannten Lösungen nicht sofort. Zum Beispiel AddKeysToAgent yesund UseKeychain yesin der .ssh/configDatei werden von Nicht-Apple-ssh-Versionen nicht erkannt und verursachen einen Fehler. Dasselbe gilt für die Option -Aoder -Kfür den sshClient.

Das bedeutet, dass die Antwort von @mluisbrown überhaupt nicht funktioniert. Sie können Methode 1 von @JakeGoulds Antwort verwenden und das ssh-addDienstprogramm macOS explizit verwenden .bash_profile, um alle Schlüssel zum Schlüsselbund hinzuzufügen, dh:

/usr/bin/ssh-add -A

Wie oben in einem Kommentar erwähnt , müssen Sie möglicherweise zuerst einen Schlüssel zum Schlüsselbund hinzufügen: z/usr/bin/ssh-add -K .ssh/github

n1000
quelle
2

Die Änderung von ~ / .ssh / config, um UseKeyChain für alle Hosts hinzuzufügen, reicht aus, um diesen wiederkehrenden Albtraum zu stoppen;)

Host *
 UseKeychain yes

Wenn die Datei leer ist oder nicht existiert, erstellen und / oder fügen Sie die obige Konfiguration hinzu.

chim
quelle
1

Ich habe auf Mac OS X Sierra (10.12.6) aktualisiert. Ich könnte in andere Hosts ssh aber nicht in github.com.

Folgendes musste ich in ~ / .ssh / config einfügen:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Nach dieser Änderung konnte ich Github wie zuvor verwenden.

Matthias Bohlen
quelle