¿Cómo puedo deshabilitar SSH KeychainIntegration en OS X Mavericks?

Tengo algunos problemas con SSH KeychainIntegration en OS X Mavericks. He intentado hurgar en el sitio de soporte de Apple, pero no he visto a nadie que tenga mi problema. He visto a muchas personas que aparentemente no saben cómo usar SSH tan bien, así que decidí probar con otra comunidad.

Primero, mi configuración está funcionando. Puedo usar mi par de claves y ssh para hosts según sea necesario, con mis credenciales almacenadas en caché en el agente. Puedo ver mis credenciales en caché a través de "ssh-add -l", como se esperaba. Se me solicita que ingrese mi contraseña mediante un cuadro de diálogo estilo OS X, con una casilla de verificación que dice "Recordar contraseña en mi llavero". Por lo general, ignoro esta casilla de verificación, pero cuando la marco, veo mi clave almacenada en el llavero. Sin embargo, esta clave almacenada en el llavero aparentemente nunca se usa, ya que tengo una contraseña. Al menos eso es lo que he deducido de varias cosas que he leído. Cuando ingreso mi contraseña en el cuadro de diálogo, y la clave se almacena en caché en el agente, me conecto con éxito, pero no antes de que me digan "Error al guardar la contraseña en el llavero". Ver este mensaje de error es lo que me llevó a investigar más a fondo; No me gusta recibir un error cada vez que me conecto.

Las cosas se ponen interesantes al mirar la página de manual SSH_CONFIG(5) . Existen dos opciones para manejar el llavero, específicas de Apple: AskPassGUI y KeychainIntegration. Puede alternar estos en ~/.ssh/config, y hacerlo produce algunos resultados interesantes.

Si configura AskPassGUI en no, ya no se le solicitará un cuadro de diálogo al estilo de OS X, sino una línea de texto de entrada en su terminal. No hay problema. Pero si hace esto, entonces ssh-agent no almacenará en caché sus credenciales. Esto está claramente roto y es frustrante porque podría vivir fácilmente con el mensaje de texto si las credenciales se almacenaran en caché.

Al configurar KeychainIntegration en no, ssh arroja un error grave, de la siguiente manera:

~/.ssh/config: line 11: Bad configuration option: KeychainIntegration
~/.ssh/config: terminating, 1 bad configuration options

Mi pregunta, simplemente, es la siguiente: ¿Hay alguna forma de deshabilitar la integración de llavero OS X para SSH?

Buena pregunta, no tengo una respuesta inmediata, pero espero que con los votos que tenga, aparezca en el radar de alguien. Puedo confirmar el error en mi compilación de OS X con solo un archivo de configuración de una línea: establecer el valor en sí o no falla como se describe.
Un punto de aclaración: solo recibo el mensaje "Error al guardar la contraseña en el llavero" cuando ssh-add almacena correctamente las credenciales. No lo veo en cada intento de conexión, que es como se lee, cuando lo vuelvo a leer. Con las credenciales almacenadas en caché, simplemente se conecta en silencio, como era de esperar.

Respuestas (1)

Según el código fuente de la versión actual de SSH que se envía con Mavericks (ubicado aquí ), parece que la funcionalidad de la opción de configuración KeychainIntegrationaún no se ha implementado. Hago esta suposición en función del contenido de openssh/readconf.h , que no hace referencia a la KeychainIntegrationopción. Sin embargo, hace referencia a la askpassguiopción. La verificación de la estructura de "palabras clave" en ese archivo muestra que la keychainintegrationopción no está presente (lo que a su vez implica que oBadOptionse devolvería el código de operación (NULL)).

Otra pista que implica que la funcionalidad que desea no está implementada de la manera que especifica la página del manual es el archivo: openssh/keychain.c . El código fuente en realidad muestra que el defaultssistema (es decir, los archivos de Lista de propiedades) se está utilizando para almacenar configuraciones relacionadas con KeychainIntegration. Específicamente, las líneas de la store_in_keychainfunción hacen referencia a KeychainIntegration:

/* Bail out if KeychainIntegration preference is -bool NO */
if (get_boolean_preference("KeychainIntegration", 1, 1) == 0) {
    fprintf(stderr, "Keychain integration is disabled.\n");
    goto err;
}

Aquí está la get_boolean_preferencefunción correspondiente. Tenga en cuenta que se utiliza CFPreferencesCopyAppValuepara obtener un valor booleano del identificador de aplicación "org.openbsd.openssh":

#if defined(__APPLE_KEYCHAIN__)

static int get_boolean_preference(const char *key, int default_value,
int foreground)
{
int value = default_value;
CFStringRef keyRef = NULL;
CFPropertyListRef valueRef = NULL;

keyRef = CFStringCreateWithCString(NULL, key, kCFStringEncodingUTF8);
if (keyRef != NULL)
    valueRef = CFPreferencesCopyAppValue(keyRef,
        CFSTR("org.openbsd.openssh"));
if (valueRef != NULL)
    if (CFGetTypeID(valueRef) == CFBooleanGetTypeID())
        value = CFBooleanGetValue(valueRef);
    else if (foreground)
        fprintf(stderr, "Ignoring nonboolean %s preference.\n", key);

if (keyRef)
    CFRelease(keyRef);
if (valueRef)
    CFRelease(valueRef);

return value;
}

#endif

Esto podría implicar que puede deshabilitar la KeychainIntegrationfuncionalidad usted mismo ejecutando este comando predeterminado:

defaults write org.openbsd.openssh KeychainIntegration -bool NO

o para configurarlo para todos los usuarios:

sudo defaults write /Library/Preferences/org.openbsd.openssh KeychainIntegration -bool NO

Cavaste profundo y te lo agradezco. Intenté configurar KeychainIntegrationa NOtravés defaultscomo sugeriste. sshluego se comporta como si lo hubiera configurado : no se almacenan credenciales AskPassGUIen ~/.ssh/configcaché y se me solicita la frase de contraseña todo el tiempo. Menos que útil. Aún así, creo que ha respondido a la pregunta, y la respuesta es, simplemente, "Se puede desactivar, pero no está completamente implementado, y probablemente no le gusten los resultados".
Muchas gracias estuve buscando por todas partes para encontrar una respuesta a esto. Dado que tengo un archivo .zshrc personalizado que transfiero entre Mac y Linux, me estaba volviendo loco que el llavero tomara el control de la administración de ssh-agent y las claves agregadas.