macOS Sierra no parece recordar las claves SSH entre reinicios

Tengo que ejecutar este comando desde que actualicé a macOS:

ssh-add -K

Corrige el problema después del reinicio, pero tengo que ejecutar este comando cada vez que inicio sesión en mi computadora.

Si no ejecuto el comando anterior, ~/.sshse omiten mis claves y se me solicita la contraseña del servidor para establecer la conexión.

$ ssh-add -Kme dassh-add: illegal option -- K
Deberá ingresar la ruta de la clave privada después de -K. Consulte la respuesta de @JakeGould para obtener una resolución.
La actualización 10.12.2 eliminó algunas solicitudes de contraseña de servidor innecesarias para mí. Es posible que ya no necesite ejecutar ssh-add -K.
@modius Asegúrese de estar ejecutando la versión correcta de ssh-add: Debería ser /usr/bin/ssh-add, no algo instalado por homebrew, conda, etc.

Respuestas (11)

A partir de macOS Sierra 10.12.2, Apple agregó una ssh_configopción llamada UseKeychainque permite una resolución "adecuada" del problema. Agregue lo siguiente a su ~/.ssh/configarchivo:

Host *
   AddKeysToAgent yes
   UseKeychain yes     

Desde la ssh_config manpágina en 10.12.2:

UsarLlavero

En macOS, especifica si el sistema debe buscar frases de contraseña en el llavero del usuario cuando intenta usar una clave en particular. Cuando el usuario proporciona la frase de contraseña, esta opción también especifica si la frase de contraseña debe almacenarse en el llavero una vez que se haya verificado que es correcta. El argumento debe ser 'sí' o 'no'. El valor predeterminado es 'no'.

Este es un buen consejo, pero en última instancia, no es mucho mejor que agregar ssh-add -K [path to key]a a, .bash_profileya que ambos métodos requieren un nivel de modificación de archivos por parte del usuario en una cuenta de usuario que nunca se necesitó en el pasado para lograr la misma funcionalidad.
Según este enlace: openradar.appspot.com/27348363 Apple ha "re-alineado [su] comportamiento con la corriente principal de OpenSSH en esta área".
¡Es absurdo que Apple modifique el comportamiento de una manera que causará problemas a la gran mayoría de los desarrolladores (debido al impulso de GitHub al menos) y no le dijo nada a nadie!
Creo que IdentityFile ~/.ssh/id_rsaes redundante y no es necesario (al mirar las opciones predeterminadas). Nunca configuré esa opción en mi archivo de configuración ssh.
@JakeGould IMO cambiar ~/.ssh/config~es preferible ya que resuelve el problema en el sshnivel. No estoy 100% seguro de que el .bash_profilemod funcione para clientes GUI que usan ssh sin usar un shell.
Apple publicó la Nota Técnica TN2449 con respecto a ese cambio.
La mención de id_rsaen esta respuesta es confusa.
@commonpike @therealmarv Eliminé la IdentityFileopción de la respuesta porque no es obligatoria.
También funciona en 10.13
Como mencioné en apple.stackexchange.com/questions/48502/… : Apple recomienda usar IgnoreUnknown UseKeychainpara compatibilidad cruzada con Linux
Algunas de las razones clave por las que agregar UseKeychain yesal archivo .ssh/config para cada clave es un método mejor que usar ssh-add: 1. Es compatible y recomendado. 2. No se basa en el shell como agregar a .bash_profilelo haría. 3. Le permite no agregar automáticamente la frase de contraseña para una clave particularmente sensible. 4. Si agrega una nueva clave, es probable que deba editar el configarchivo de todos modos, para que pueda hacer todo en un solo lugar.
¿La configuración UseKeychain yeshace que la frase de contraseña se guarde en los reinicios (es decir, se escriba en el disco)? Si es así, ¿hay alguna manera de evitar que esto suceda? No veo cómo es una buena idea guardar una frase de contraseña SSH en una ubicación potencialmente menos segura.
@intuyó que la frase de contraseña se guarda en el disco en el llavero del usuario (eso es lo que UseKeychain yessignifica). Los llaveros de macOS están encriptados de forma segura. Si no desea que se guarden en el llavero, configure esta opción en no, pero obviamente las frases de contraseña no se conservan en los reinicios, que es de lo que se trata esta pregunta.
El archivo de configuración ni siquiera estaba allí para mí. Tuve que agregarlo yo mismo
La Host *línea anterior es innecesaria. Cualquier opción que no esté bajo Hostse considerará configuración global.

También tuve este problema al intentar implementar un código usando Capistrano . Muy frustrante. Aquí hay dos métodos que conozco para lidiar con este problema.

Método 1: agregue todas las claves conocidas al agente SSH.

Entonces, una solución que encontré es ejecutar ssh-addcon la -Aopción, que agrega todas las identidades conocidas al agente SSH usando cualquier frase de contraseña almacenada en su llavero, como esta:

ssh-add -A

Ahora esto funciona, pero no persistirá en los reinicios. Entonces, si no quiere volver a preocuparse por esto, simplemente abra el ~/.bash_profilearchivo de su usuario de esta manera:

nano ~/.bash_profile

Y añade esta línea al final:

ssh-add -A 2>/dev/null;

Ahora, cuando abra una nueva ventana de Terminal, ¡todo debería estar bien!

Método 2: agregue solo las claves SSH que están en el llavero al agente.

Entonces, si bien la ssh-add -Aopción debería funcionar para la mayoría de los casos básicos, recientemente me encontré con un problema en el que tenía 6-7 cajas Vagrant (que usan claves/identidades SSH para el acceso) configuradas en una máquina además de las más comunes id_rsa.pub.

Para resumir, terminé sin acceso a un servidor remoto debido a demasiados intentos fallidos basados ​​en claves/identidades SSH, ya que el acceso al servidor se basaba en una contraseña y las claves/identidades SSH son claves/identidades SSH. Entonces, el agente SSH probó todas mis claves SSH, falló y ni siquiera pude acceder a la solicitud de contraseña.

El problema es que ssh-add -Asimplemente agregará arbitrariamente cada clave/identidad SSH que tenga al agente, incluso si no es necesario hacerlo; como en el caso de las cajas Vagrant.

Mi solución después de muchas pruebas fue la siguiente.

En primer lugar, si tiene más claves/identidades SSH añadidas a su agente de las que necesita, como se muestra ssh-add -l, elimínelas todas del agente de la siguiente manera:

ssh-add -D

Una vez hecho esto, inicie el agente SSH como un proceso en segundo plano así:

eval "$(ssh-agent -s)"

Ahora, se pone raro y no estoy muy seguro de por qué. En algunos casos, puede agregar específicamente la ~/.ssh/id_rsaclave/identidad al agente de la siguiente manera:

ssh-add ~/.ssh/id_rsa

Escriba su frase de contraseña, presione Returny debería estar listo para comenzar.

Pero en otros casos, simplemente ejecutar esto es suficiente para agregar la clave/identidad:

ssh-add -K

Si todo eso funcionó, escriba ssh-add -ly debería ver una sola clave/identidad SSH en la lista.

¿Todo está bien? Ahora abre tu .bash_profile:

nano ~/.bash_profile

Y agregue esta línea al final; comente o elimine la -Aversión si tiene eso en su lugar:

ssh-add -K 2>/dev/null;

Eso permitirá que la clave/identidad SSH se vuelva a cargar en el agente SSH en cada inicio/reinicio.

ACTUALIZACIÓN: Apple ahora ha agregado una UseKeychainopción a las opciones de configuración de SSH abiertas y ssh-add -Atambién considera una solución.

A partir de macOS Sierra 10.12.2, Apple agregó una UseKeychainopción de configuración para configuraciones SSH. Al consultar la página del manual (a través man ssh_configde ) se muestra la siguiente información:

UseKeychain
        On macOS, specifies whether the system should search for
        passphrases in the user's keychain when attempting to use a par-
        ticular key. When the passphrase is provided by the user, this
        option also specifies whether the passphrase should be stored
        into the keychain once it has been verified to be correct.  The
        argument must be ``yes'' or ``no''.  The default is ``no''.

Lo que se reduce a que Apple ve la solución como una adición ssh-add -Aa su cuenta .bash_profile , como se explica en este ticket de Open Radar, o UseKeychaincomo una de las opciones por usuario ~/.ssh/config.

no funciona para mí; pero tengo una contraseña en la clave.
@modius: si tiene una clave protegida por pw, haga ssh-add -K [path to key]e ingrese pw cuando se le solicite. El llavero almacenará la contraseña y ssh-add la obtendrá desde allí después de eso.
Tenga en cuenta que -A es para agregar identidades al agente utilizando cualquier frase de contraseña almacenada en su llavero. Si además tiene identidades sin frases de contraseña, deberá omitir la opción -A para agregarlas a su agente.
Solo para agregar un poco más de visibilidad a esto, Apple actualizó la página de manual para que ssh_config incluya UseKeychainy AddKeysToAgentagregue automáticamente sus claves desde su ssh_config. No se necesitan secuencias de comandos de shell. Consulte la respuesta de @mluisbrown a continuación para obtener la información actualizada para 10.12.2
@RyanGibbons "No se necesitan scripts de shell". Este es un buen consejo, pero si se le da a elegir entre editar una ~/.ssh/configconfiguración para agregar 4 líneas de configuración o agregar una línea ssh-add -K [path to key]a un .bash_profile, ninguna solución es ideal. El escenario ideal es una actualización a macOS 10.12.2 que eliminaría la necesidad de realizar cualquier modificación de cualquier configuración manualmente para lograr esta funcionalidad básica y esperada.
@JakeGould Entiendo lo que dices, en realidad me gusta lo que están haciendo. En lugar de guardar automáticamente la frase de contraseña en el llavero y cargarla en el arranque, le dan el control de su seguridad. /encogimiento de hombros
@RyanGibbons FWIW, mire la sugerencia oficial de Relaciones con desarrolladores de Apple en esta respuesta en OpenRadar: "Puede solucionar esto con bastante facilidad ejecutando ssh-add -Asu script rc si desea que sus claves estén siempre cargadas". ¯\_(ツ)_/¯
LOL, gracias por eso, por lo que agregan las opciones ssh_config para manejar esto automáticamente, pero no recomiendan usarlas.
vale la pena señalar que la opción UseKeychain no funciona si uno está usando el ssh instalado con homebrew
ssh-add -Ano funciona en Mojave (10.14.6 (18G4032)), con ssh-add nuevo (/usr/local/Cellar/openssh/8.3p1/bin/ssh-add). Parece que está funcionando con estos 2 (usando el nuevo ssh-add): ssh-add -K ~/.ssh/id_rsaentoncesssh-add ~/.ssh/id_rsa
Un comentario más: asegúrese de que está usando /usr/bin/ssh-addy no algo instalado por homebrew, conda, etc. (Compruebe which ssh-addpara estar seguro).

Como se explica aquí , este es el método recomendado desde macOS 10.12.2 :

  1. Agregue las siguientes líneas a su ~/.ssh/configarchivo:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Cualquier clave que agregue al ssh-agent usando el ssh-add /path/to/your/private/key/id_rsacomando se agregará automáticamente al llavero y debería cargarse automáticamente al reiniciar.


Estoy agregando esta respuesta porque:

  • Otras respuestas le dicen que agregue la IdentityFile ~/.ssh/id_rsalínea, pero esa opción no es necesaria para cargar automáticamente las claves (y en realidad vinculará esa clave en particular para la sección de host a la que la agrega, lo que no querrá si usa diferentes claves para calores diferentes).
  • La respuesta aceptada menciona UseKeychain, pero eso no es suficiente para conservar las claves ssh-agentdespués de un reinicio.
Respecto al segundo punto. ¿Qué tan seguro estás? En realidad, no sucede nada al reiniciar y tampoco se menciona en su material de referencia. Lo que sucede con la configuración anterior es que su cliente SSH cargará la clave en el agente en la primera conexión (y también obtendrá la frase de contraseña del llavero), luego la clave permanecerá cargada. Puede verificar esta declaración enumerando las claves justo después de reiniciar ssh-add -Ly se informará The agent has no identities. No habrá nada allí hasta que te conectes. ¡ Las AddKeysToAgentclaves no persisten entre reinicios de ninguna manera!

He escrito una breve publicación sobre este tema que podría ayudarte.

Una solución es llamar ssh-add -Aal comando en cada inicio.

Simplemente agregue .plistun archivo con el siguiente contenido a la ruta ~/Library/LaunchAgents/o cree uno con la aplicación Lingon :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>ssh-add-a</string>
    <key>ProgramArguments</key>
    <array>
        <string>ssh-add</string>
        <string>-A</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

<!-- @@@@LingonWhatStart:ssh-add -A@@@@LingonWhatEnd -->

Desde macOS 10.12.2 puedes usar la UseKeychainopción. Lea más aquí o busque en man ssh_config.

     UseKeychain
         On macOS, specifies whether the system should search for passphrases in the user's keychain
         when attempting to use a particular key. When the passphrase is provided by the user, this
         option also specifies whether the passphrase should be stored into the keychain once it has
         been verified to be correct.  The argument must be ``yes'' or ``no''.  The default is ``no''.

Así que solo haz lo siguiente:

echo "UseKeychain yes" >> ~/.ssh/config

El uso >>está en riesgo si ingresa el comando varias veces. Mejor haga una edición manual del archivo, como se describe en mluisbrown answer o ChrisJF answer .
Estás justo ahí :-)

Tuve este problema antes y encontré una manera de evitarlo. Acabo de crear un archivo llamado configen mi ~/.sshcarpeta, donde agregué las siguientes líneas:

Host github.com
HostName github.com
IdentityFile ~/.ssh/github
IdentitiesOnly yes

No estoy seguro de por qué, pero Hostambos HostNameson importantes. En mi caso, si uno de ellos no estaba presente, la solución no funcionó.

Luego, acabo de hacer un ssh-add -Ky estaba funcionando incluso después del reinicio.

Host es su nombre/alias definido por el usuario para un servidor en particular y delimita las entradas por servidor: estilísticamente, es bueno sangrar las líneas que siguen a la entrada Host. HostName indica el nombre direccionable de la red del servidor, como github.com, pero también podría usar una dirección IP. Host y HostName no tienen que ser lo mismo, pero sí, ambos son parte integral del formato de configuración ssh.

Si está utilizando una versión diferente de ssh (por ejemplo, instalada a través de homebrew), las soluciones anteriores no funcionarán de inmediato. Por ejemplo, AddKeysToAgent yesy UseKeychain yesen el .ssh/configarchivo no son reconocidos por versiones ssh que no sean de Apple y provocarán un error. Lo mismo para la opción -Au para el cliente.-Kssh

Eso significa que la respuesta de @mluisbrown no funcionará en absoluto. Puede usar el método 1 de la respuesta de @ Giacomo1968 y usar explícitamente la utilidad macOS ssh-adden su .bash_profilepara agregar todas las claves al llavero, es decir:

/usr/bin/ssh-add -A

Como se menciona en un comentario anterior , es posible que primero deba agregar una clave al llavero: por ejemplo/usr/bin/ssh-add -K .ssh/github

Encontré que ssh-add -Kme dio " opción ilegal - K ". Esto se debió a que ssh-add era una versión extraña proveniente de /usr/local/bin (¿instalada por brew?). Pude agregar la clave mediante el uso específico de ssh-add ubicado en /usr/bin:

/usr/bin/ssh-add -K ~/.ssh/id_rsa
esto es lo que funcionó para mí después de no poder trabajar fácilmente durante años.

Modificar ~/.ssh/config para agregar UseKeyChain para todos los hosts es suficiente para detener esta pesadilla recurrente;)

Host *
 UseKeychain yes

Si el archivo está vacío o no existe, simplemente cree y/o agregue la configuración anterior.

Actualicé a Mac OS X Sierra (10.12.6). Podría ssh en otros hosts pero no en github.com.

Esto es lo que tuve que insertar en ~/.ssh/config:

PubkeyAcceptedKeyTypes ssh-dss,ssh-rsa

Después de ese cambio, podría usar github como antes.

Hay una pregunta similar respondida en este hilo en Askubuntu. Encontré una gran solución para eso al agregar un complemento para el shell oh-my-zsh al que cambié desde bash.