Cómo añadir una clave SSH a ssh-agent y al Llavero de macOS

Añade AddKeysToAgent yes y UseKeychain yes a ~/.ssh/config, luego ejecuta ssh-add --apple-use-keychain ~/.ssh/id_ed25519 una vez y escribe la frase de contraseña. Se guarda en el Llavero de inicio de sesión, y ssh la carga en el agente cuando hace falta, también después de reiniciar. Las antiguas opciones -K y -A ahora se llaman --apple-use-keychain y --apple-load-keychain.

Actualizada el . ssh-add -l, -d, -t y -D, AddKeysToAgent e IdentitiesOnly con un archivo de clave pública se ejecutaron con el OpenSSH 10.3 incluido en macOS, usando claves desechables sin entrada en el Llavero.

Configura tu ssh config

Añade esto a ~/.ssh/config:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
  • UseKeychain yes busca la frase de contraseña en tu Llavero cuando se usa una clave, y la guarda allí después de que la escribas correctamente.
  • AddKeysToAgent yes añade la clave al agente en marcha la primera vez que se usa, de modo que queda desbloqueada para las conexiones siguientes.
  • IdentityFile indica la clave. Sin esta línea, ssh sigue probando los nombres por defecto.

Un archivo de clave sin frase de contraseña no tiene nada que guardar. Si el tuyo no tiene, añade una antes con ssh-keygen -p -f ~/.ssh/id_ed25519.

¿Aún no tienes clave? Consulta cómo generar una clave SSH Ed25519 y pon una frase de contraseña cuando te la pida.

Guarda la frase de contraseña

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

Escribe la frase de contraseña una vez. Luego comprueba que el agente tiene la clave:

ssh-add -l

Lista la huella de cada clave cargada, y dice The agent has no identities. si no hay ninguna.

No necesitas iniciar el agente tú mismo. En macOS, launchd inicia ssh-agent bajo demanda para tu sesión, y SSH_AUTH_SOCK ya apunta a él. No añadas eval "$(ssh-agent)" al perfil de tu shell: eso inicia un agente aparte en cada shell.

Después de reiniciar

El agente empieza vacío tras reiniciar, pero la frase de contraseña sigue en el Llavero. Con la configuración de arriba, tu primera conexión ssh la lee de allí y carga la clave en el agente. Para cargar todas las claves guardadas de una vez:

ssh-add --apple-load-keychain

Apple cambió este comportamiento en macOS 10.12.2. Las instrucciones más antiguas pueden suponer que las claves se cargan solas. Si te piden la frase de contraseña una y otra vez, comprueba que AddKeysToAgent yes y UseKeychain yes estén ambos configurados.

Las antiguas opciones -K y -A

Las guías más antiguas usan ssh-add -K y ssh-add -A. La página del manual de Apple dice que se renombraron a --apple-use-keychain y --apple-load-keychain. Siguen funcionando en algunos casos, pero en OpenSSH estándar -K significa otra cosa, relacionada con las claves de hardware. Usa los nombres largos.

Si usas otro ssh en el mismo Mac

UseKeychain existe solo en el ssh que distribuye Apple. Otras compilaciones, como una de Homebrew o la de una máquina Linux que comparte tus dotfiles, se detienen con este error:

Bad configuration option: usekeychain

Para mantener una sola configuración para todos, indica a ssh que ignore la opción donde no se conozca. Debe ir antes de la línea que la usa:

IgnoreUnknown UseKeychain

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

Para ver cuál estás ejecutando:

which ssh
ssh -V

La compilación de Apple está en /usr/bin/ssh. Las opciones --apple- también existen solo en el /usr/bin/ssh-add de Apple.

Demasiadas claves: IdentitiesOnly

Por defecto, ssh ofrece todas las claves del agente, además de los archivos que configuraste. Con varias claves esto puede acabar en Too many authentication failures, y además informa a cada servidor de claves que no tiene motivo para ver. Limita un host a una sola clave:

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

IdentitiesOnly yes no desactiva el agente. Si el agente tiene la clave indicada, ssh sigue usándola desde allí, así que no se vuelve a pedir la frase de contraseña. IdentityFile puede incluso apuntar al archivo .pub cuando la clave privada solo está en el agente.

Quitar o limitar una clave

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

Los simples -d y -D solo vacían el agente. Con UseKeychain yes la frase de contraseña sigue en el Llavero, y la clave vuelve en tu siguiente conexión.

Cualquiera que haya iniciado sesión como tú en un Mac desbloqueado puede usar las claves del agente, y también cualquier programa que ejecutes. Si eso te preocupa, usa AddKeysToAgent confirm para que cada uso necesite aprobación, pero ten en cuenta que esto requiere un programa SSH_ASKPASS que funcione. Piénsalo también antes de usar el reenvío del agente: consulta los riesgos del reenvío del agente.

Preguntas

¿Por qué mi Mac me pide una y otra vez la frase de contraseña de la clave SSH?

Normalmente falta AddKeysToAgent yes o UseKeychain yes en ~/.ssh/config. Añade las dos y ejecuta una vez ssh-add --apple-use-keychain con tu clave.

¿Sigue funcionando ssh-add -K en macOS?

Apple lo renombró a --apple-use-keychain, y -A a --apple-load-keychain. En el OpenSSH estándar, -K significa otra cosa, relacionada con llaves de hardware, así que usa los nombres largos.

¿Cómo veo qué claves tiene ssh-agent?

Ejecuta ssh-add -l. Muestra la huella de cada clave cargada, o The agent has no identities. si está vacío.

Fuentes

Más en Claves y acceso

Todas las guías