Як я можу відключити SSH KeychainIintegration в OS X Mavericks?


18

У мене виникають проблеми із SSH KeychainIintegration в OS X Mavericks. Я спробував замислитися над сайтом підтримки Apple, але не бачив, щоб хтось мав проблему. Я бачив багато людей, які, здається, не знають, як добре використовувати SSH, тому вирішили спробувати іншу спільноту.

По-перше, моя конфігурація працює. Я можу використовувати свою пару ключів і ssh для хостів так, як мені потрібно, при цьому мої облікові дані кешуються в агенті. Я можу бачити свої кешовані облікові дані через "ssh-add -l", як очікувалося. Мені пропонується ввести свій пароль у діалоговому вікні OS X, з позначкою "Запам'ятати пароль у моїй брелоці". Зазвичай я ігнорую цей прапорець, але коли я перевіряю його, я бачу свій ключ, збережений у брелоку. Цей ключ, що зберігається у брелоку, здається, ніколи не використовується, оскільки я маю на ньому пароль. Принаймні, це те, що я зібрав з різних речей, які я прочитав. Коли я ввожу свій пароль у діалоговому вікні, і ключ кешується в агенті, я успішно підключаюсь, але не раніше, ніж мені сказати «Не вдалося зберегти пароль у брелок». Бачити це повідомлення про помилку - це те, що змусило мене далі розслідувати; Мені не подобається отримувати помилку щоразу, коли я підключаюся.

Речі стають цікавими при перегляді мандатної сторінки SSH_CONFIG (5) . Існує два варіанти роботи з брелоком, характерні для Apple: AskPassGUI та KeychainIntegration. Ви можете перемикати їх у ~ / .ssh / config, і це робить кілька цікавих результатів.

Якщо встановити "AskPassGUI" ні, вам більше не буде запропоновано діалогове вікно OS X, натомість рядок введення тексту у терміналі. Немає великого. Але якщо ви це зробите, ssh-агент не буде кешувати ваші облікові дані. Це, очевидно, порушено, і засмучує, тому що я міг легко жити з текстовим підказом, якщо кешировані дані.

Якщо встановити KeychainIintegration на ні, ssh видає грубу помилку таким чином:

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

Моє запитання просто таке: чи існує спосіб фактично відключити ОС X X Keychain Integration для SSH?


Приємне запитання, я не маю негайної відповіді, але, сподіваючись, голоси, які вона отримає, з’являться на чиїмсь радарі. Я можу підтвердити помилку в моїй збірці OS X лише за допомогою одного конфігураційного файлу в одному рядку - встановлення значення "так" або "не" не вдається як описано.
bmike

Точка уточнення: я отримую повідомлення "Збереження пароля в брелок бреху не вдалося", коли ssh-add успішно кешує облікові дані. Я не бачу його під час кожної спроби з'єднання, саме так воно читається, коли я перечитую його. З кешованими обліковими даними він просто спокійно з’єднується, як ви і очікували.
Джим

Відповіді:


7

Виходячи з вихідного коду для поточної версії SSH, що постачається з Mavericks (розташована тут ), виявляється, що функція параметра config KeychainIntegrationще не була реалізована. Я роблю це припущення на основі вмісту openssh / readconf.h , який не посилається на KeychainIntegrationпараметр. Однак він посилається на askpassguiваріант. Перевірка структури "ключових слів" у цьому файлі дійсно показує, що keychainintegrationопція відсутня (що, в свою чергу, означає, що oBadOptionоп (код NULL) буде повернуто).

Ще одна підказка, що означає, що потрібна вам функція не реалізована так, як вказується сторінка man, - файл: openssh / keychain.c . Вихідний код фактично показує, що defaultsсистема (тобто файли списку властивостей) використовується для зберігання налаштувань, пов’язаних із KeychainIntegration. Зокрема, рядки з store_in_keychainпосилання на функцію KeychainIintegration:

/* 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;
}

Ось відповідна get_boolean_preferenceфункція. Зауважте, що він використовується CFPreferencesCopyAppValueдля отримання булевого символу з ідентифікатора програми "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

Це може означати, що ви можете відключити KeychainIntegrationфункціональність для себе, виконавши цю команду за замовчуванням:

defaults write org.openbsd.openssh KeychainIntegration -bool NO

або встановити його для всіх користувачів:

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


2
Ви копали глибоко, і я ціную це. Я спробував налаштувати KeychainIntegrationна NOvia, defaultsяк ви запропонували. sshповодиться так, як якщо б я встановити AskPassGUIв ~/.ssh/config- ніякі облікові дані не кешуються, і я запитаний ключову фразу весь час. Менш корисного. І все-таки я думаю, що ви відповіли на питання, і відповідь - це просто: "Його можна відключити, але це не повністю реалізовано, і результати, напевно, вам не сподобаються".
Джим-

Дуже дякую, що я шукав усюди, щоб знайти відповідь на це. Оскільки у мене є власний файл .zshrc, який я портую між mac та linux, він наводив мені гайки, що брелок взяв під контроль управління ssh-агентом та доданими ключами.
LF4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.