Wie verwende ich Mac OS X Keychain mit SSH-Schlüsseln?

141

Ich verstehe, dass der Schlüsselbund seit Mac OS X Leopard das Speichern von SSH-Schlüsseln unterstützt. Könnte bitte jemand erklären, wie diese Funktion funktionieren soll.

Ich habe einige von mir generierte RSA-Schlüssel in meinem ~ / .ssh-Verzeichnis gespeichert, um auf verschiedene Server zugreifen zu können. Ich habe keine Passphrasen für diese Schlüssel. Zur Zeit verwende ich die folgenden Befehle im Terminal, um mich bei diesen Servern anzumelden:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh user @ server

(Ich habe einige Bash-Funktionen geschrieben, um dies zu vereinfachen.)

Gibt es eine bessere Möglichkeit, dies mit dem Schlüsselbund zu tun?

John Topley
quelle

Antworten:

16

Damit dies funktioniert, sollte auf die $SSH_AUTH_SOCKUmgebungsvariable verwiesen werden /tmp/launch-xxxxxx/Listeners. Dies sollte automatisch erfolgen, wenn Sie sich anmelden. Der Listener an diesem Socket spricht das Protokoll ssh-agent.

Ihre Bash-Skripte starten Ihren eigenen ssh-Agenten ( ssh-agentnicht ssh_agent) und überschreiben den vorhandenen ssh-agent, der bei der Anmeldung für Sie eingerichtet wurde.

Der Sinn des Schlüsselbunds besteht auch darin, die Passwörter in Ihren SSH-Schlüsseln zu speichern. Sie sagen jedoch, dass Sie für diese Schlüssel keine Passphrasen festgelegt haben, sodass ich nicht sicher bin, was Sie von der Schlüsselbundintegration erwarten.

Wenn Sie sich zum ersten Mal anmelden, wird wahrscheinlich kein ssh-agent-Prozess angezeigt. Dieser Vorgang wird automatisch von den Startdiensten gestartet, wenn zum ersten Mal versucht wird, diesen Socket einzulesen /tmp.

Rudedog
quelle
1
Vielen Dank. Ich muss also noch ausgeführt werden ssh-add, um meine RSA-Identitäten dem Standard-SSH-Agenten hinzuzufügen, der beim Anmelden gestartet wurde.
John Topley
Sie müssen nicht ssh-add ausführen. ssh-agent fragt beim ersten Ausführen von ssh nach der Passphrase des Schlüssels.
Rudedog
3
Es fordert mich jedes Mal zur Eingabe des Passworts auf, wenn ich ssh starte. Der Punkt ist, dass ich keine Passwörter eingeben muss.
John Topley
1
Was fordert Sie zur Eingabe des Passworts auf? Ich beginne zu vermuten, dass es der Remote-Server ist, der Sie dazu auffordert, was Ihre Aussage, dass Ihre Schlüssel keine Passphrasen haben, in eine bessere Perspektive bringt. Wenn Sie das Kennwort auf dem Remoteserver umgehen möchten, müssen Sie Ihren öffentlichen Schlüssel $HOME/.ssh/authorized_keysauf diesem Server hinzufügen . Der ssh-agent + Schlüsselbund von Mac OS wird nur zum Speichern der Passphrase für Ihre lokalen ssh-Schlüssel verwendet. Es ist nicht dazu gedacht, Remote-Passwörter über vorhandene SSH-Verbindungen zu senden.
Rudedog
1
Verwenden Sie ssh -vdiese Option, um zu diagnostizieren, was ssh gerade tut. Verwenden Sie auch sshd -p 8900 -vauf der Serverseite und um ssh -v remote:8900zu diagnostizieren, was sshd tut.
Rudedog
252

Ab der Leopard-Version von OS X ist ssh-agent enger in Keychain integriert. Es ist möglich, die Passphrasen aller Ihrer SSH-Schlüssel sicher im Schlüsselbund zu speichern, von dem ssh-agent sie beim Start liest. Das Fazit ist, dass es einfach ist, Ihre Schlüssel mit Passwörtern zu sichern, aber niemals die Passphrase eingeben müssen, um sie zu verwenden! Hier ist, wie:

Fügen Sie die Passphrase zu jedem SSH-Schlüssel zum Schlüsselbund hinzu: (Option -k lädt nur einfache private Schlüssel, überspringt Zertifikate)

ssh-add -K [path/to/private SSH key]

(Beachten Sie, das ist eine Hauptstadt K)

Jedes Mal, wenn Sie Ihren Mac neu starten, werden alle SSH-Schlüssel in Ihrem Schlüsselbund automatisch geladen. Sie sollten in der Lage sein, die Schlüssel in der Keychain Access-App sowie von der Befehlszeile aus zu sehen:

ssh-add -l
jeffmcc
quelle
ssh-add -llistet keine Schlüssel auf, wenn eine Remote-Verbindung hergestellt wird (wobei $ DISPLAY nicht festgelegt ist). Hier müssen spezielle Tricks angewendet werden, um den Schlüsselbund zu verwenden (z. B. in superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Sie benötigen außerdem die Option -K, um Passphrases im Schlüsselbund zu speichern.
Neeme Praks
5
Wenn Sie eine andere Version von SSH über ein Paketsystem wie Homebrew installiert haben, müssen Sie einen absoluten Pfad wie verwenden /usr/bin/ssh-add.
Ludovic Kuty
1
Interessanterweise fragt mein macOS Sierra nach einem Neustart nicht nach dem Kennwort, sondern ssh-add -lgibt "Der Agent hat keine Identitäten" zurück. ( ps auxenthält /usr/bin/ssh-agent -l).
Halil Özgür
4
Für macOS Sierra haben sich die Dinge geändert. Siehe github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
80

Ab macOS Sierra , ssh-agent nicht mehr Auto-Lasten vorher SSH - Schlüssel geladen , wenn Sie sich in Ihrem Konto anmelden. Dies ist eine Absicht von Apple, sie wollten sich wieder an die Mainstream- OpenSSH- Implementierung anpassen . [1]


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.


Folgendes ist veraltet (wird als Referenz aufbewahrt).

Um zum vorherigen Verhalten zurückzukehren, möchten Sie den ssh-add -ABefehl ausführen (der alle SSH-Schlüssel mit Passphrasen auf Ihrem Schlüsselbund automatisch lädt), wenn Sie sich anmelden. Gehen Sie hierzu folgendermaßen vor:

  1. Fügen Sie zunächst alle Schlüssel hinzu, die Sie mit dem Befehl automatisch in den ssh-agent laden möchten ssh-add -K /absolute/path/to/your/private/key/id_rsa. Das -KArgument stellt sicher, dass die Passphrase zum Schlüsselbund von macOS hinzugefügt wird . Stellen Sie sicher, dass Sie den absoluten Pfad zum Schlüssel verwenden. Wenn Sie einen relativen Pfad verwenden, wird das automatisch gestartete Skript Ihren Schlüssel nicht finden.

  2. Stellen Sie sicher, dass alle Ihre Schlüssel bei der Eingabe als hinzugefügt angezeigt werden ssh-add -A.

  3. Erstellen Sie eine Datei mit dem Namen com.yourusername.ssh-add.plistin ~/Library/LaunchAgents/den Inhalten unten. Plist-Dateien wie diese werden launchdzum Ausführen von Skripten verwendet, wenn du dich anmeldest . [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Bitte geben Sie launchddie laden plist - Datei die Sie gerade erstellt durch die Ausführung: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

Und Sie sollten bereit sein.

Ricardo Sanchez-Saez
quelle
33

Es gibt einen einfacheren Weg als Ricardos Antwort, um Ihr Passwort zwischen Sitzungen / Neustarts Ihres Mac mit 10.12 Sierra beizubehalten.

  1. ssh-add -K ~/.ssh/id_rsa
    Hinweis: Ändern Sie den Pfad dahin, wo sich Ihr Schlüssel id_rsa befindet.
  2. ssh-add -A
  3. Erstellen Sie die folgende ~/.ssh/configDatei (oder bearbeiten Sie sie, falls vorhanden) :

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Jetzt wird das Passwort zwischen Neustarts gespeichert!

Apple hat das Verhalten von ssh-agent in macOS 10.12 Sierra absichtlich dahingehend geändert, dass die vorherigen SSH-Schlüssel nicht mehr automatisch geladen werden, wie in dieser Diskussion zu OpenRadar , Twitter und Technical Note von Apple beschrieben . Die obige Lösung ahmt das alte Verhalten von El Capitan nach und speichert Ihr Passwort.

ChrisJF
quelle
2
Super, funktioniert wie ein Zauber, imho viel sauberer als die anderen und an der richtigen Stelle gelöst :)
GerardJP
10

Hinweis: Informationen zu macOS Sierra finden Sie in der aktuelleren Antwort von ChrisJF .

Die [Antwort von Jeff McCarrell] [2] ist richtig, mit der Ausnahme, dass der Befehl zum Hinzufügen der Passphrase einen Bindestrich anstelle eines Bindestrichs enthält, dh –Kanstatt -Keine Nachricht zu erzeugen, die bewirkt, dass –K: No such file or directory. Es sollte lauten:

ssh-add -K [path/to/private SSH key]
simonair
quelle
2
Dies sollte eher ein Kommentar zu der Antwort sein, auf die Sie sich beziehen, als eine neue Antwort. Hier geht es um Sicherheit. Man könnte vorschlagen, dass Sie es sorgfältig ssh-add -K
abtippen
1
Wenn ich einen Bindestrich mit K benutze, verstehe ich illegal option -- K. Kleinbuchstabe k ist optional aufgeführt.
Sam Dutton
Danke für die Rückmeldung. Ich habe gerade auf macOS Sierra gecheckt -K
:,
6

Ich vermute, Sie verwenden nicht den Standardbefehl ssh. Hast du sshüber Ports installiert? Versuchen Sie festzustellen which ssh, welchen sshBefehl Sie verwenden.

Normalerweise sollte ein Dialogfeld angezeigt werden, in dem Sie nach Ihrem Kennwort gefragt werden, sofern es nicht bereits in Ihrem Schlüsselbund gespeichert ist.

Olly
quelle
Ich benutze keine Ports.
John Topley
Danke für die Info :) Ich hatte Probleme, weil ich OpenSSH von Homebrew verwendete.
ggustafsson
6

Ich hatte ein ähnliches Problem beim Versuch, mich mit einem Client-SSH-Zertifikat anzumelden. In diesem speziellen Fall war es für den Zugriff auf ein Git-Repository. Das war die Situation:

  • Schlüssel wurde gespeichert ~/.ssh/
  • Der private Schlüssel hat eine Passphrase.
  • Die Passphrase wird im OS X-Anmeldeschlüsselbund gespeichert. ~/Library/Keychains/login.keychain
  • Die Verbindung war wie folgt: Mein Mac ->Remote Mac ->Git / SSH Server
  • Mac OS X 10.8.5

Als ich über einen Remote-Desktop eine Verbindung zum Remote-Mac herstellte, hatte ich kein Problem. Beim Herstellen einer Verbindung mit SSH zum Remote-Mac wurde ich jedoch jedes Mal nach der SSH-Passphrase gefragt. Die folgenden Schritte haben es für mich gelöst.

  1. security unlock-keychainDie Passphrase wird im Anmeldeschlüsselbund gespeichert. Dadurch wird die Sperre aufgehoben und ssh-agent kann darauf zugreifen.
  2. eval `ssh-agent -s`Startet ssh-agent für die Shell. Die Passphrase wird vom Schlüsselbund abgerufen und zum Entsperren des privaten SSH-Schlüssels verwendet.
  3. Stellen Sie die ssh / git-Verbindung her und erledigen Sie meine Arbeit.
  4. eval `ssh-agent -k` Töte den laufenden ssh-Agenten.
  5. security lock-keychain Schließen Sie den Schlüsselbund wieder.
Orkoden
quelle
1
Damit # 2 für mich innerhalb eines Alias ​​funktioniert, musste ich eval \$(ssh-agent)per Re: Remote Login und Schlüsselbund arbeiten . Wenn nicht innerhalb eines Alias eval $(ssh-agent)funktioniert ( ohne den Backslash $ ).
Travis
4

Siehe auch:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... Hinzufügen dieser Notiz, da weitere Details angefordert wurden: Mit dem Befehl "security" können Schlüssel (und andere Dinge) direkt in Keychains importiert werden. Das Schöne ist, dass Sie im Gegensatz zu ssh-add den Schlüsselbund angeben können. Dadurch ist es möglich, direkt in das System Keychain zu importieren ("man security" um zu lernen wie)

Xaphod
quelle
1
Könnten Sie diese Antwort bitte etwas näher erläutern? Vielen Dank.
Matthew Williams
1

Die beste und von Apple beabsichtigte Lösung (seit macOS 10.12.2) wird hier beschrieben

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 ChrisJF als Antwort beschrieben .
Cœur
Ja, Sie genau dort
Ben