¿Cómo puedo agregar permanentemente mi clave privada SSH a Keychain para que esté disponible automáticamente para ssh?


419

Parece que ssh-add -K ~/.ssh/id_rsacargará su clave, pero le pedirá la contraseña cada vez que reinicie.

Estoy buscando una solución que no requiera que vuelva a ingresar la contraseña clave entre inicios de sesión.


1
¿Puedes decir un poco más sobre cuándo aparece la solicitud de contraseña? Pregunto porque tengo una clave ssh para un servidor remoto, lo cual le aseguro que no es lo mismo que mi contraseña de inicio de sesión de Mac ni nada, y no he tenido que ingresar la contraseña de la clave ssh durante años . Puedo abrir una terminal, escribir "ssh <server>", y estoy allí. Creo que configuré esta clave por primera vez en OSX 10.5. id_dsa, pero no creo que eso deba importar.
Michael H.

Mi id_rsaclave tiene una contraseña.
sorin

También tengo el problema de que resolví esto hace tanto tiempo que no puedo recordar exactamente lo que hice. Pero creo que la idea es no correr ssh-add, sino solo correr sshdirectamente. Debería aparecer una ventana emergente que será la frase de paso para la clave, y con una casilla de verificación que le permita almacenarla en su llavero.
Harald Hanche-Olsen

1
@Sorin, ¡también el mío! Tuve que ingresarlo una vez, hace mucho tiempo, y la Mac me lo ha guardado desde entonces. Esperemos que el consejo de Harald ayude.
Michael H.

¿Se refiere a la contraseña del llavero (es decir, su contraseña de inicio de sesión) o la contraseña de la clave? Si es lo último, ¿tus frases de contraseña definitivamente están almacenadas en Keychain? Puede verificar esto abriendo Keychain Access y buscándolo en el llavero de inicio de sesión.
Mathew Hall

Respuestas:


688

En OSX, el ssh-addcliente nativo tiene un argumento especial para guardar la frase de contraseña de la clave privada en el llavero OSX, lo que significa que su inicio de sesión normal lo desbloqueará para usarlo con ssh. En OSX Sierra y versiones posteriores, también debe configurar SSH para usar siempre el llavero (consulte el Paso 2 a continuación).

Alternativamente, puede usar una clave sin una frase de contraseña, pero si prefiere la seguridad, eso es ciertamente aceptable con este flujo de trabajo.

Paso 1 - Guarda la llave en el llavero

Solo haz esto una vez:

ssh-add -K ~/.ssh/[your-private-key]

Ingrese su frase clave y no se le volverá a pedir.

(Si está en una versión anterior de Sierra de OSX, ya ha terminado, no se requiere el Paso 2).

Paso 2: configura SSH para usar siempre el llavero

Parece que OSX Sierra eliminó el comportamiento conveniente de persistir sus claves entre inicios de sesión, y la actualización a ssh ya no usa el llavero por defecto. Debido a esto, se le pedirá que ingrese la frase de contraseña para una clave después de la actualización, y nuevamente después de cada reinicio.

La solución es bastante simple y se describe en este comentario de hilo de github . Así es como lo configuras:

  1. Asegúrese de haber completado el Paso 1 anterior para almacenar la clave en el llavero.

  2. Si aún no lo ha hecho, cree un ~/.ssh/configarchivo. En otras palabras, en el .sshdirectorio de su directorio de inicio, cree un archivo llamado config.

  3. En ese .ssh/configarchivo, agregue las siguientes líneas:

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

    Cambie ~/.ssh/id_rsaal nombre de archivo real de su clave privada. Si tiene otras claves privadas en su ~.sshdirectorio, también agregue una IdentityFilelínea para cada una de ellas. Por ejemplo, tengo una línea adicional que se lee IdentityFile ~/.ssh/id_ed25519para una segunda clave privada.

    Esta UseKeychain yeses la parte clave, que le dice a SSH que busque en su llavero OSX la frase clave.

  4. ¡Eso es! La próxima vez que cargue cualquier conexión ssh, probará las claves privadas que haya especificado y buscará su frase de contraseña en el llavero OSX. No se requiere escribir frase de contraseña.


2
Esto casi me funcionó. Mi llavero de "inicio de sesión" ya tenía el bloqueo automático desactivado, por lo que la respuesta de Matthew Sanabria no se aplicaba. El uso ssh-add -K ...agregó las claves al agente ssh sin solicitar una contraseña, pero solo para la sesión actual. Después de reiniciar, tuve que volver a emitir el comando.
Poulsbo

44
@Poulsbo y @Abram: vea mi actualización, Sierra cambió el comportamiento automático y ahora debe ejecutarlo ssh-add -Amanualmente para cargar su llavero guardado. Algunas posibles soluciones mencionadas anteriormente.
trisweb

3
@trisweb Gracias por el consejo. ¡La solución de joshbuchea de modificar el .ssh/configarchivo parece prometedora! Ver github.com/lionheart/openradar-mirror/issues/…
Poulsbo

2
@sorin vea la respuesta actualizada y avíseme si tiene algún comentario. ¡Gracias!
trisweb

99
¡Funciona genial! En mi caso, necesitaba usar la Abandera además de la Kpara agregar mis llaves al llavero y registrar la frase de contraseña ( ssh-add -AK ~/.ssh/[your-private-key]). ¡Gracias!
Youssman

22

Tuve un problema similar, ya que me pedían CADA VEZ mi frase de contraseña de clave de pub.

Por sugerencia del usuario "trisweb" anterior, activé estas opciones a ~ / .ssh / config:

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

PERO todavía se le solicitó cada vez que quería usar ssh.

Eventualmente encendí "ssh -v" y encontré esta línea de depuración:

debug1: key_load_private: se ha proporcionado una frase de contraseña incorrecta para descifrar la clave privada

Luego abrí mi llavero en "Keychain Access.app", encontré la clave llamada "SSH: /Users/username/.ssh/id_rsa" y la abrí.

Hice clic en "Mostrar contraseña" para revelar la contraseña y de hecho encontré que la frase de contraseña en el llavero era una frase de contraseña antigua.

Actualicé la frase de contraseña en Keychain Access, y ahora funciona sin contraseña.

También podría haber actualizado la frase de contraseña con esta frase:

ssh-keygen -p -f ~ / .ssh / id_rsa


13

Se le solicita la contraseña cada vez porque su llavero de "inicio de sesión" se bloquea después de la inactividad y / o de dormir o, en su caso, de reiniciar. Hay dos formas de resolver esto por usted.

  1. Cambie la configuración de su llavero de "inicio de sesión". Suponiendo que su clave ssh esté almacenada en el llavero de "inicio de sesión".

    • Acceso a llavero abierto
    • Resalte el llavero "iniciar sesión"
    • Haga clic derecho o haga clic en la opción "iniciar sesión" llavero
    • Desmarque las casillas de verificación "Bloquear después de X minutos de inactividad" y "Bloquear cuando duerme".
  2. Genere otra clave SSH sin usar una frase de contraseña.

    • Terminal abierta
    • Introducir comando: ssh-keygen -t rsa -b 4096 -C <comment> -f <.ssh/id_rsa>
    • -t es para tipo, -b es tamaño de clave, -C es comentario, -f archivo de salida (primero debe crear directorios)
    • No establezca una frase de contraseña.
    • Importe la clave SSH al llavero de "inicio de sesión" con ssh-add -K <path to ssh key>

Ya no se le debe solicitar una contraseña de llavero.


2
Tenga en cuenta que al invocar ssh-adddesde dentro de SSH, security unlock-keychaindebe llamarse primero. Además, no tuve que crear los directorios para el -fparámetro. Desafortunadamente, todavía tenía que llamar security unlocl-keychaina sesiones SSH para acceder al llavero de inicio de sesión, que solicita contraseña cada vez ...
Ohad Schneider

2
El punto es tener una frase de contraseña en la clave. Dudo que generar una nueva clave SSH sea útil para la pregunta.
Gris

7

Además, en macOS Sierra y HighSierra (no sé sobre versiones anteriores), la ejecución ssh-add -Ahará que el agente cargue todas las claves cuyas frases de contraseña se almacenan en Keychain ... Muy útil


7

En todos los lugares donde lo anterior no funcionó, mi problema parece haber sido porque estaba duplicando el UseKeychain yes& AddKeysToAgent yesen todos los perfiles / accesos directos de teclas ssh. Actualicé mi ~/.ssh/configarchivo para declararlos solo una vez y ahora todos se cargan al iniciar sesión sin solicitar contraseñas al inicio, por ejemplo:

Host *
  UseKeychain yes
  AddKeysToAgent yes
  IdentityFile ~/.ssh/foo
  IdentityFile ~/.ssh/bar

Host foo
  HostName foo.com
  User fooUser
  IdentityFile ~/.ssh/foo

Host bar
  HostName bar.com
  User barUser
  IdentityFile ~/.ssh/bar

-3

Agregue la clave pública en:

.ssh/known_hosts

La clave pública generalmente está activada:

/home/user/.ssh/id_rsa.pub

Espero que ayude


8
Creo que quiero decirauthorized_keys
Rene Larsen

De todos modos, ¡esto no funciona si tienes más de una clave!
sorin