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
- Apple Technical Note TN2449, OpenSSH updates in macOS 10.12.2
- ssh_config(5), manual de OpenBSD
- ssh-add(1), manual de OpenBSD
- ssh-agent(1), manual de OpenBSD