Comment utiliser le Mac OS X Keychain avec les clés SSH?

Je comprends que depuis Mac OS X Leopard, le Porte-clés a pris en charge le stockage des clés SSH. Quelqu'un pourrait-il expliquer comment cette fonctionnalité devrait fonctionner.

J'ai certaines clés RSA que j'ai générées stockées dans mon répertoire ~ / .ssh pour accéder à différents serveurs. Je n'ai pas de mots de passe définis sur ces clés. Actuellement, pour pouvoir me connecter à ces serveurs, j'utilise les commandes suivantes dans le terminal:

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

(J'ai écrit quelques fonctions de Bash pour faciliter cette tâche).

Existe-t-il une meilleure façon de le faire en utilisant le porte-clés?

Pour que cela fonctionne, la variable d'environnement $SSH_AUTH_SOCK doit être pointé vers /tmp/launch-xxxxxx/Listeners . Ceci est censé être fait automatiquement lorsque vous vous connectez. L'auditeur sur ce socket parle du protocole ssh-agent.

Vos scripts bash commencent votre propre agent ssh ( ssh-agent orthographié, pas ssh_agent) et remplaçant le ssh-agent existant qui est configuré pour vous lors de la connexion.

En outre, le point entier du porte-clés est de stocker les mots de passe sur vos clés ssh, mais vous dites que vous n'avez pas de mots de passe définis sur ces clés, donc je ne suis pas sûr de ce que vous attendez de l'intégration des clés.

Enfin, lorsque vous vous connectez, vous ne verrez probablement pas un processus ssh-agent. Ce processus sera démarré automatiquement en lançant des services la première fois que quelque chose essaie de lire ce socket dans /tmp .

À partir de la version Leopard de OS X, ssh-agent est plus étroitement intégré avec le porte-clés. Il est possible de stocker en toute sécurité les mots-clés de toutes vos clés SSH dans la clé, dont ssh-agent les lira au démarrage. En bout de ligne, il est simple de sécuriser vos clés avec les mots de passe, mais ne doit jamais taper la phrase de passe pour les utiliser! Voici comment:

Ajoutez la phrase de passe à chaque clé ssh à la clé: (option -k charge uniquement les clés privées simples, ignore les certificats)

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

(Notez que c'est une capitale K)

Chaque fois que vous redémarrez votre Mac, toutes les clés SSH de votre porte-clés seront automatiquement chargées. Vous devriez pouvoir voir les clés dans l'application Accès par clé, ainsi que par la ligne de commande via:

 ssh-add -l 

De MacOS Sierra , ssh-agent ne charge plus automatiquement les clés ssh chargées précédemment lorsque vous vous connectez à votre compte. Ceci est intentionnel sur Apple partie, ils ont voulu ré-aligner avec la mise en œuvre OpenSSH grand public. [1]


Comme expliqué ici , c'est la méthode recommandée depuis MacOS 10.12.2 :

  1. Ajoutez les lignes suivantes à votre fichier ~/.ssh/config :

     Host * UseKeychain yes AddKeysToAgent yes 
  2. Toute clé que vous ajoutez au ssh-agent à l'aide de la commande ssh-add /path/to/your/private/key/id_rsa sera automatiquement ajoutée au porte-clés et devrait être activée automatiquement lors du redémarrage.


Ce qui suit est obsolète (conservé pour référence).

Pour revenir au comportement précédent, vous souhaitez exécuter la commande ssh-add -A (qui charge automatiquement toutes les clés ssh qui ont des phrases de passe sur votre porte-clés) lorsque vous vous connectez. Pour ce faire, suivez ces pas:

  1. Tout d'abord, ajoutez toutes les clés que vous souhaitez charger automatiquement sur ssh-agent à l'aide de la commande ssh-add -K /absolute/path/to/your/private/key/id_rsa . L'argument -K garantit que la phrase-clé est ajoutée au porte-clés du macros . Assurez-vous d'utiliser le chemin absolu vers la clé. L'utilisation d'un chemin relatif rendra le script lancé automatiquement pour ne pas trouver votre clé.

  2. Assurez-vous que toutes vos clés sont affichées comme ajoutées lorsque vous tapez ssh-add -A .

  3. Créez un fichier appelé com.yourusername.ssh-add.plist dans ~/Library/LaunchAgents/ avec le contenu ci-dessous. Les fichiers Plist tels que celui-ci sont utilisés par launchd pour exécuter des scripts lorsque vous vous connectez. [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. Tell launchd pour charger le fichier plist que vous venez de créer en exécutant: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist .

Et vous devriez être tous ensemble.

Il y a un moyen plus simple que la réponse de Ricardo de persister votre mot de passe entre les sessions / redémarrages de votre Mac avec 10,12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Remarque: modifiez le chemin vers lequel se trouve votre clé id_rsa.
  2. ssh-add -A
  3. Créez (ou modifiez s'il existe) le fichier ~/.ssh/config :

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

    Maintenant, le mot de passe est rappelé entre les redémarrages!

Apple a délibérément changé le comportement de ssh-agent dans MacOS 10.12 Sierra pour ne plus charger automatiquement les clés SSH précédentes, comme indiqué dans cette discussion OpenRadar , Twitter et Note technique d'Apple . La solution ci-dessus imite l'ancien comportement de El Capitan et rappelez-vous votre mot de passe.

Remarque: pour MacOS Sierra, reportez-vous à la réponse plus récente de ChrisJF .

La [réponse de Jeff McCarrell] [2] est correcte, sauf que la commande d'ajouter la phrase de passe contient un tiret au lieu d'un trait d'union, c'est-à-dire –K au lieu de -K , provoquant un message à l'effet de –K: No such file or directory . Il devrait se lire:

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

Je suppose que vous n'utilisez pas la commande ssh par défaut. Avez-vous installé ssh via les ports? Essayez which ssh pour voir quelle commande ssh vous utilisez.

Habituellement, il devrait afficher une boîte de dialogue vous demandant un mot de passe, s'il n'est pas déjà enregistré dans votre porte-clés.

J'ai eu un problème similaire en essayant de me connecter en utilisant un client ssh cert. Dans ce cas particulier, il s'agissait d'accéder à un dépôt git. C'était la situation:

  • La clé a été enregistrée dans ~/.ssh/
  • La clé privée possède une phrase secrète.
  • La phrase de passe est stockée dans le chapeau de connexion OS X. ~/Library/Keychains/login.keychain
  • La connexion était la suivante: mon mac -> remote mac -> git / ssh server
  • Mac OS X 10.8.5

Lorsque je me suis connecté à un Mac distant utilisant le bureau à distance, je n'ai pas eu de problème. Cependant, lorsque vous vous connectez avec SSH au mac distant, on m'a demandé chaque fois la phrase secrète ssh. Les étapes suivantes l'ont résolu pour moi.

  1. security unlock-keychain La phrase de passe est stockée dans le keychain de connexion. Cela le déverrouille et permet à ssh-agent d'y accéder.
  2. eval `ssh-agent -s` Démarre ssh-agent pour l'utilisation de shell. Il obtiendra la phrase de passe du porte-clés et l'utilisera pour déverrouiller la clé privée ssh.
  3. Établissez la connexion ssh / git et faites mon travail.
  4. eval `ssh-agent -k` Tuez le ssh-agent en cours d'exécution.
  5. security lock-keychain nouveau le porte-clés.

Voir également:

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

… en ajoutant cette note à mesure que de plus en plus de détails étaient demandés: la commande "sécurité" est capable d'importer des clés (et d'autres choses) directement dans les Porte-clés. La bonne chose est que, contrairement à ssh-add, vous pouvez spécifier le porte-clés. Cela permet d'importer directement dans le système Keychain ("man security" pour apprendre comment)

La meilleure solution proposée par Apple et Apple (depuis MacOS 10.12.2) est décrite ici

Alors, faites simplement ce qui suit:

Echo "UseKeychain oui" >> ~ / .ssh / config