Как я могу отключить SSH KeychainIntegration в OS X Mavericks?

18

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

Во-первых, моя конфигурация работает. Я могу использовать свою пару ключей и ssh для хостов по мере необходимости, причем мои учетные данные кэшируются в агенте. Я могу видеть свои кэшированные учетные данные через "ssh-add -l", как и ожидалось. Мне предлагается ввести мой пароль в диалоге в стиле OS X с флажком «Запомнить пароль в моей цепочке для ключей». Я обычно игнорирую этот флажок, но когда я его проверяю, я вижу, что мой ключ хранится в цепочке для ключей. Однако этот ключ, хранящийся в цепочке для ключей, по-видимому, никогда не используется, поскольку у меня есть пароль. По крайней мере, это то, что я почерпнул из разных вещей, которые я прочитал. Когда я ввожу свой пароль в диалоговое окно и ключ кешируется в агенте, я успешно подключаюсь, но не раньше, чем получаю сообщение «Ошибка сохранения пароля в связке ключей». Это сообщение об ошибке привело меня к дальнейшему расследованию; Я не люблю получать ошибки каждый раз, когда я подключаюсь.

Вещи становятся интересными при просмотре man- страницы SSH_CONFIG (5) . Существуют два варианта работы с цепочкой для ключей, специфичные для Apple: AskPassGUI и KeychainIntegration. Вы можете переключать их в ~ / .ssh / config, и это дает некоторые интересные результаты.

Если для AskPassGUI установлено значение no, вам больше не будет предложено диалоговое окно в стиле OS X, вместо этого будет введена текстовая строка в вашем терминале. Нет, важная персона. Но если вы сделаете это, то ssh-agent не будет кешировать ваши учетные данные. Это явно сломано, и разочаровывает, потому что я мог бы легко жить с текстовой подсказкой, если учетные данные были кэшированы.

Если для KeychainIntegration установлено значение no, ssh выдает сложную ошибку следующим образом:

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

Мой вопрос, просто, заключается в следующем: есть ли способ на самом деле отключить OS X Keychain Integration для SSH?

Джим
источник
Хороший вопрос, у меня нет немедленного ответа, но надеюсь, что при наличии голосов он появится на чьем-то радаре. Я могу подтвердить ошибку в моей сборке OS X с помощью всего лишь однострочного конфигурационного файла - установка значения да или нет завершается ошибкой, как описано.
bmike
Уточнение: я получаю сообщение «Не удалось сохранить пароль в связке ключей», когда ssh-add успешно кэширует учетные данные. Я не вижу это при каждой попытке соединения, как это читается, когда я перечитываю это. С кэшированными учетными данными он просто подключается тихо, как и следовало ожидать.
Джим

Ответы:

7

Исходя из исходного кода текущей версии SSH, поставляемой вместе с Mavericks (находится здесь ), кажется, что функциональность опции конфигурации KeychainIntegrationеще не реализована. Я делаю это предположение на основе содержимого openssh / readconf.h , которое не ссылается на KeychainIntegrationопцию. Это, однако, ссылается на askpassguiопцию. Проверка структуры «ключевые слова» в этом файле действительно показывает, что keychainintegrationопция отсутствует (что, в свою очередь, означает, что oBadOptionбудет возвращен код операции (NULL)).

Еще одна подсказка, подразумевающая, что желаемая функциональность не реализована в том виде, в котором она указана на странице руководства, - это файл: openssh / keychain.c . Исходный код фактически показывает, что defaultsсистема (т.е. файлы списка свойств) используется для хранения настроек, связанных с KeychainIntegration. В частности, строки из store_in_keychainфункции ссылаются на 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;
}

Вот соответствующая 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на NOчерез, defaultsкак вы предложили. sshведет себя так, как если бы я установить AskPassGUIв ~/.ssh/config- никакие учетные данные не кэшируются, и я запрошен ключевую фразу все время. Менее чем полезно. Тем не менее, я думаю, что вы ответили на вопрос, и ответ прост: «Его можно отключить, но он не полностью реализован, и вам, вероятно, не понравятся результаты».
Джим
Большое спасибо, что я искал во всем, чтобы найти ответ на этот вопрос. Так как у меня есть собственный файл .zshrc, который я портирую между mac и linux, меня сводило с ума то, что цепочка для ключей взяла на себя управление управляющим ssh-agent и добавленными ключами.
LF4