macOS Sierra no parece recordar claves SSH entre reinicios

185

Tengo que ejecutar este comando desde la actualización 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.

bisherbas
fuente
1
$ ssh-add -Kme dassh-add: illegal option -- K
modius
1
Deberá ingresar la ruta de la clave privada después -K. Vea la respuesta de @JakeGould para su resolución.
bisherbas
La actualización 10.12.2 eliminó algunas solicitudes innecesarias de contraseña del servidor para mí. Es posible que ya no necesite ejecutar ssh-add -K.
Wayfaring Stranger

Respuestas:

216

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 del 10.12.2:

UseKeychain

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'.

mluisbrown
fuente
2
Según este enlace: openradar.appspot.com/27348363 Apple ha "realineado [su] comportamiento con el OpenSSH convencional en esta área".
ThomasW
15
¡Es absurdo que Apple modifique el comportamiento de una manera que causará problemas para la gran mayoría de los desarrolladores (debido al empuje de GitHub, si no más) y no dijo nada a nadie!
mluisbrown
99
Creo que IdentityFile ~/.ssh/id_rsaes redundante y no es necesario (al mirar las opciones predeterminadas). Nunca he configurado esa opción en mi archivo de configuración ssh.
therealmarv
99
@JakeGould IMO cambio ~/.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.
mluisbrown
77
Apple publicó la Nota técnica TN2449 sobre ese cambio.
Kentzo
107

También tuve este problema al intentar implementar algún código usando Capistrano . Muy frustrante. Aquí hay dos métodos que conozco para tratar 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á entre reinicios. Entonces, si no desea preocuparse por esto nuevamente, simplemente abra el ~/.bash_profilearchivo de su usuario de esta manera:

nano ~/.bash_profile

Y agregue esta línea al final:

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

Ahora, cuando abras 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, aunque 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 Vagabundos (que usan claves / identidades SSH para el acceso) configuradas en una máquina además de las más comunes id_rsa.pub.

En pocas palabras, terminé siendo bloqueado de un servidor remoto debido a demasiados intentos fallidos basados ​​en claves / identidades SSH ya que el acceso al servidor se basó 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 -Asolo 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.

Primero, si tiene más claves / identidades SSH agregadas a su agente de las que necesita, como se muestra con, ssh-add -lentonces purgue 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 funcionó, escriba ssh-add -ly debería ver una sola clave / identidad SSH en la lista.

¿Todo bien? Ahora abre tu .bash_profile:

nano ~/.bash_profile

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

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 SSH abiertas y también considera ssh-add -Auna solución.

A partir de macOS Sierra 10.12.2, Apple ha agregado una UseKeychainopción de configuración para configuraciones SSH. La comprobación de la página de manual (vía man ssh_config) 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 vea que la solución se agrega ssh-add -Aa la .bash_profile suya como se explica en este boleto de Open Radar o se agrega UseKeychaincomo una de las opciones en cada usuario ~/.ssh/config.

JakeGould
fuente
44
@modius: si tiene una clave protegida pw, haga ssh-add -K [path to key]e ingrese pw cuando se le solicite. Keychain almacenará la contraseña y ssh-add la obtendrá desde allí después de eso.
Timo
2
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.
Evan Pon
12
Solo para agregar un poco más de visibilidad a esto, Apple ha actualizado la página de manual para que ssh_config incluya UseKeychainy AddKeysToAgentagregue automáticamente sus claves desde su ssh_config. No se necesitan scripts de shell. Consulte la respuesta de @mluisbrown a continuación para obtener la información actualizada para 10.12.2
Ryan Gibbons
1
@JakeGould puedo entender 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 están dando el control de su seguridad. / encogimiento de hombros
Ryan Gibbons
1
@RyanGibbons FWIW, mire la sugerencia oficial de Apple Developer Relations en esta respuesta en OpenRadar: "Puede solucionar esto bastante fácilmente ejecutando ssh-add -Asu script rc si desea que sus claves estén siempre cargadas". ¯\_(ツ)_/¯
JakeGould
16

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 agente ssh utilizando el ssh-add /path/to/your/private/key/id_rsacomando se agregará automáticamente al llavero, y debe cargarse automáticamente al reiniciar.


Estoy agregando esta respuesta porque:

  • Otras respuestas le indican 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 agregará, lo que no querrá si usa diferentes claves para diferentes hots).
  • La respuesta aceptada menciona UseKeychain, pero eso no es suficiente para persistir las claves ssh-agentdespués de un reinicio.
Ricardo Sanchez-Saez
fuente
1
En cuanto al segundo punto. ¿Qué tan seguro estás? En realidad, no ocurre 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 buscará 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 mediante ssh-add -Le informará The agent has no identities. Nada estará allí hasta que te conectes. El AddKeysToAgentno persiste las teclas entre reinicios de ninguna manera!
Danila Vershinin
15

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

Una solución es llamar al ssh-add -Acomando en cada inicio.

Simplemente agregue un .plistarchivo 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 -->
Jirsbek
fuente
8

Desde macOS 10.12.2 puede usar la UseKeychainopción. Lea más aquí o investigue 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

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

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
Fiskabollen
fuente
Esto es lo que funcionó para mí después de no poder trabajar fácilmente durante años.
nyxee
4

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

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

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

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

infinito
fuente
1
Host es su nombre / alias definido por el usuario para un servidor en particular y delimita las entradas por servidor: estilísticamente es agradable sangrar las líneas que siguen a la entrada de Host. HostName indica el nombre direccionable de la red del servidor como github.com, pero también puede 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.
Mark Fox
4

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 causarán un error. Lo mismo para la opción -Au -Kpara el sshcliente.

Eso significa que la respuesta de @mluisbrown no funcionará en absoluto. Puede usar el método 1 de la respuesta de @JakeGould y usar explícitamente la ssh-addutilidad macOS en 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

n1000
fuente
2

Enmendar ~ / .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.

chim
fuente
1

Actualicé a Mac OS X Sierra (10.12.6). Podría pasar a otros hosts pero no a 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.

Matthias Bohlen
fuente