Come posso disattivare SSH KeychainIntegration in OS X Mavericks?

18

Sto riscontrando alcuni problemi con SSH KeychainIntegration in OS X Mavericks. Ho provato a sondare il sito di supporto di Apple, ma non ho visto nessuno che avesse il mio problema. Ho ho visto molte persone che apparentemente non sanno come usare SSH così bene, così ho deciso di provare un'altra comunità.

Innanzitutto, la mia configurazione funziona. Sono in grado di utilizzare la mia coppia di chiavi e ssh per gli host come ho bisogno, con le mie credenziali di essere in cache nell'agente. Sono in grado di vedere le mie credenziali memorizzate nella cache tramite "ssh-add -l", come previsto. Mi viene richiesto di inserire la mia password da una finestra di dialogo in stile OS X, con una casella di controllo che dice "Ricorda la password nel mio portachiavi". Di solito ignoro questa casella di controllo, ma quando la controllo, vedo la mia chiave memorizzata nel portachiavi. Questa chiave memorizzata nel portachiavi è apparentemente mai usata, tuttavia, dato che ho una password. Almeno questo è quello che ho raccolto da varie cose che ho letto. Quando inserisco la mia password nella finestra di dialogo, e la chiave viene memorizzata nella cache dell'agente, mi collego correttamente, ma non prima che mi venga detto "Salvataggio della password sul portachiavi non riuscito". Vedere questo messaggio di errore è ciò che mi ha spinto a indagare ulteriormente; Non mi piace ricevere un errore ogni volta che mi collego.

Le cose diventano interessanti quando si guarda alla pagina di manuale SSH_CONFIG (5 ) . Esistono due opzioni per gestire il portachiavi, specifiche per Apple: AskPassGUI e KeychainIntegration. Sei in grado di attivare questi in ~ / .ssh / config, e così facendo si ottengono risultati interessanti.

Impostando AskPassGUI su no, non ti verrà più richiesto un dialogo in stile OS X, ma una riga di testo di input nel tuo terminale. No biggie. Ma se lo fai, allora ssh-agent non memorizzerà le tue credenziali nella cache. Questo è chiaramente rotto e frustrante perché potrei facilmente vivere con il prompt del testo se le credenziali sono state memorizzate nella cache.

Impostando KeychainIntegration su no, ssh genera un errore grave, come segue:

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

La mia domanda, semplicemente, è questa: esiste un modo per disabilitare effettivamente l'integrazione di Keychain OS X per SSH?

    
posta Jim 20.02.2014 - 12:08
fonte

1 risposta

7

In base al codice sorgente per la versione corrente di SSH spedita con Mavericks (che si trova qui ), sembra che la funzionalità dell'opzione di configurazione KeychainIntegration non sia stata ancora implementata. Sto facendo questo presupposto basato sul contenuto di openssh / readconf.h , che non fa riferimento all'opzione KeychainIntegration . Tuttavia, fa riferimento all'opzione askpassgui . Il controllo della struttura "keywords" in quel file mostra effettivamente che l'opzione keychainintegration non è presente (il che a sua volta implica che verrà restituito il codice op oBadOption (NULL).

Un altro indizio che implica che la funzionalità desiderata non è implementata nel modo in cui la pagina man specifica è il file: OpenSSH / keychain.c . Il codice sorgente mostra in realtà che defaults sistema (ad esempio, file Elenco proprietà) viene utilizzato per memorizzare le impostazioni relative a KeychainIntegration . In particolare, le righe dalla funzione store_in_keychain reference 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;
}

Ecco la corrispondente funzione get_boolean_preference . Tieni presente che sta utilizzando CFPreferencesCopyAppValue per ottenere un valore booleano dall'identificatore dell'applicazione "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

Ciò potrebbe implicare che puoi disattivare la funzionalità KeychainIntegration per te stesso eseguendo questo comando di default:

defaults write org.openbsd.openssh KeychainIntegration -bool NO

o per impostarlo per tutti gli utenti:

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

    
risposta data 04.03.2014 - 20:24
fonte

Leggi altre domande sui tag