Comment ajouter une clé SSH à ssh-agent et au Trousseau macOS

Ajoutez AddKeysToAgent yes et UseKeychain yes à ~/.ssh/config, puis lancez une fois ssh-add --apple-use-keychain ~/.ssh/id_ed25519 et tapez la phrase secrète. Elle est enregistrée dans votre Trousseau de session, et ssh la charge dans l'agent au besoin, y compris après un redémarrage. Les anciennes options -K et -A s'appellent désormais --apple-use-keychain et --apple-load-keychain.

Mis à jour le . ssh-add -l, -d, -t et -D, AddKeysToAgent et IdentitiesOnly avec un fichier de clé publique ont été exécutés avec l'OpenSSH 10.3 inclus dans macOS, avec des clés jetables sans entrée dans le Trousseau.

Configurer ssh

Ajoutez ceci à ~/.ssh/config :

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
  • UseKeychain yes cherche la phrase secrète dans votre Trousseau quand une clé est utilisée, et l'y enregistre après que vous l'avez saisie correctement.
  • AddKeysToAgent yes ajoute la clé à l'agent en cours la première fois qu'elle sert, pour qu'elle reste déverrouillée pour les connexions suivantes.
  • IdentityFile désigne la clé. Sans cette ligne, ssh essaie quand même les noms par défaut.

Un fichier de clé sans phrase secrète n'a rien à stocker. Si la vôtre n'en a pas, ajoutez-en une d'abord avec ssh-keygen -p -f ~/.ssh/id_ed25519.

Pas encore de clé ? Voir comment générer une clé SSH Ed25519, et choisissez une phrase secrète quand elle est demandée.

Enregistrer la phrase secrète

ssh-add --apple-use-keychain ~/.ssh/id_ed25519

Tapez la phrase secrète une fois. Vérifiez ensuite que l'agent détient la clé :

ssh-add -l

Il liste l'empreinte de chaque clé chargée, et affiche The agent has no identities. s'il n'y en a aucune.

Vous n'avez pas besoin de démarrer l'agent vous-même. Sous macOS, launchd lance ssh-agent à la demande pour votre session, et SSH_AUTH_SOCK pointe déjà vers lui. N'ajoutez pas eval "$(ssh-agent)" à votre profil de shell : cela lance un agent distinct dans chaque shell.

Après un redémarrage

L'agent démarre vide après un redémarrage, mais la phrase secrète est toujours dans le Trousseau. Avec la configuration ci-dessus, votre première connexion ssh l'y lit et charge la clé dans l'agent. Pour charger d'un coup toutes les clés enregistrées :

ssh-add --apple-load-keychain

Apple a modifié ce comportement dans macOS 10.12.2. Les anciennes instructions supposent parfois que les clés se chargent d'elles-mêmes. Si la phrase secrète vous est redemandée sans cesse, vérifiez que AddKeysToAgent yes et UseKeychain yes sont bien tous deux définis.

Les anciennes options -K et -A

Les guides plus anciens utilisent ssh-add -K et ssh-add -A. La page de manuel d'Apple dit qu'elles ont été renommées --apple-use-keychain et --apple-load-keychain. Elles fonctionnent encore dans certains cas, mais dans OpenSSH standard -K a un autre sens, lié aux clés matérielles. Utilisez les noms longs.

Si vous utilisez un autre ssh sur le même Mac

UseKeychain n'existe que dans le ssh fourni par Apple. Les autres versions, comme celle de Homebrew ou celle d'une machine Linux qui partage vos dotfiles, s'arrêtent avec cette erreur :

Bad configuration option: usekeychain

Pour garder une seule configuration pour tous, dites à ssh d'ignorer l'option là où elle est inconnue. Cela doit précéder la ligne qui l'utilise :

IgnoreUnknown UseKeychain

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

Pour voir lequel vous exécutez :

which ssh
ssh -V

La version d'Apple se trouve dans /usr/bin/ssh. Les options --apple- n'existent aussi que dans le /usr/bin/ssh-add d'Apple.

Trop de clés : IdentitiesOnly

Par défaut, ssh propose chaque clé de l'agent, ainsi que les fichiers que vous avez configurés. Avec plusieurs clés, cela peut finir en Too many authentication failures, et cela informe chaque serveur de clés qu'il n'a aucune raison de voir. Limitez un hôte à une seule clé :

Host server
  HostName 203.0.113.10
  User user
  IdentityFile ~/.ssh/id_ed25519_work
  IdentitiesOnly yes

IdentitiesOnly yes ne désactive pas l'agent. Si l'agent détient la clé nommée, ssh l'utilise quand même depuis l'agent, et la phrase secrète n'est donc pas redemandée. IdentityFile peut même pointer vers le fichier .pub quand la clé privée n'est que dans l'agent.

Retirer ou limiter une clé

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

-d et -D seuls ne vident que l'agent. Avec UseKeychain yes, la phrase secrète reste dans le Trousseau, et la clé revient à votre prochaine connexion.

Toute personne connectée sous votre nom sur un Mac déverrouillé peut utiliser les clés de l'agent, tout comme n'importe quel programme que vous lancez. Si cela vous inquiète, utilisez AddKeysToAgent confirm pour que chaque utilisation demande une approbation, mais notez que cela exige un programme SSH_ASKPASS fonctionnel. Réfléchissez aussi avant d'utiliser la redirection d'agent : voir les risques de la redirection d'agent.

Questions

Pourquoi mon Mac redemande-t-il sans cesse la phrase secrète de ma clé SSH ?

En général, AddKeysToAgent yes ou UseKeychain yes manque dans ~/.ssh/config. Ajoutez les deux, puis lancez une fois ssh-add --apple-use-keychain avec votre clé.

ssh-add -K fonctionne-t-il encore sur macOS ?

Apple l'a renommé --apple-use-keychain, et -A --apple-load-keychain. Dans OpenSSH standard, -K signifie autre chose, lié aux clés matérielles : utilisez les noms longs.

Comment voir les clés chargées dans ssh-agent ?

Lancez ssh-add -l. Il affiche l'empreinte de chaque clé chargée, ou The agent has no identities. s'il est vide.

Sources

Autres guides : Clés et connexion

Tous les guides