如何在OS X Mavericks中禁用SSH KeychainIntegration?


18

我在OS X Mavericks中遇到SSH KeychainIntegration的问题。我曾尝试在Apple的支持网站上闲逛,但还没有人遇到我的问题。我见过很多人似乎不太了解如何使用SSH,所以我决定尝试另一个社区。

首先,我的配置正常。我可以根据需要将密钥对和ssh用于主机,并且凭据可以缓存在代理中。我可以按预期通过“ ssh-add -l”查看我的缓存凭据。OS X样式对话框提示我输入密码,并带有一个复选框:“在钥匙串中记住密码”。我通常会忽略此复选框,但是当我选中它时,我确实会看到我的钥匙存储在钥匙串中。但是,由于我上面有密码,因此似乎从未使用过存储在钥匙串中的钥匙。至少那是我从阅读过的各种东西中学到的东西。当我在对话框中输入密码并将密钥缓存在代理中时,我可以成功连接,但是没有被告知“将密码保存到钥匙串失败”。看到此错误消息是促使我进行进一步调查的原因。我不喜欢每次连接都出错。

查看联机帮助页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

我的问题很简单:这是否有一种方法可以实际禁用SSH的OS X钥匙串集成?


好的问题,我没有一个即时的答案,但希望有了它的投票,它会在某人的雷达上弹出。我只需一个配置文件就可以确认OS X构建中的错误-如所述将值设置为yes或no失败。
bmike

需要澄清的一点是:当ssh-add成功缓存凭据时,我仅收到消息“将密码保存到钥匙串失败”。我没有看到它在每次连接尝试,这是怎么读,当我重新阅读。有了缓存的凭据,它就可以像您期望的那样安静地连接。
2014年

Answers:


7

根据Mavericks随附的当前版本SSH的源代码(位于此处),似乎KeychainIntegration尚未实现config选项的功能。我基于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
您挖得很深,对此我表示感谢。我尝试按照您的建议设置KeychainIntegrationNOvia defaultsssh然后表现为,如果我设定AskPassGUI~/.ssh/config-没有凭据被缓存起来,并提示我输入密码短语所有的时间。不到用。不过,我认为您已经回答了这个问题,答案很简单:“可以禁用它,但是它没有完全实现,您可能不喜欢结果。”
吉姆

非常感谢,我到处搜索以找到答案。由于我有一个自定义的.zshrc文件,我在Mac和linux之间移植了该文件,这让我很困惑,钥匙串正在控制ssh-agent和添加的密钥的管理。
LF4 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.