2009-12-28 12:08:48 +0000 2009-12-28 12:08:48 +0000
143
143

如何用SSH密钥使用Mac OS X Keychain?

据我所知,自Mac OS X Leopard以来,Keychain已经支持存储SSH密钥。谁能解释一下这个功能是如何工作的。

我有一些我生成的RSA密钥,存储在我的~/.ssh目录下,用于访问各种服务器。我没有在这些密钥上设置密码。目前,为了登录这些服务器,我在终端中使用以下命令。

eval `ssh-agent` ssh-add ~/.ssh/some\_key\_rsa ssh user@server

(我已经写了一些Bash函数让它变得更简单。)

有没有更好的方法可以用钥匙链来实现?

答案 (9)

255
255
255
2011-04-11 19:58:42 +0000

从 OS X 的 Leopard 版本开始,ssh-agent 与 Keychain 的整合更加紧密。可以将所有 SSH 密钥的口令安全地存储在 Keychain 中,ssh-agent 将在启动时从 Keychain 中读取它们。最重要的是,用密码口令来保护你的密钥是很简单的,但永远不用输入密码来使用它们。下面是具体操作方法。

将密码短语添加到每一个ssh密钥的钥匙链上 (选项-k只加载普通私钥,跳过证书)

ssh-add -K [path/to/private SSH key]

(注意是大写的K)

每当你重启Mac,钥匙链中的所有SSH密钥都会被自动加载。你应该可以在钥匙链访问应用程序中看到钥匙,也可以通过命令行看到。

ssh-add -l
82
82
82
2016-12-12 18:17:44 +0000

macOS Sierra开始,当你登录你的账户时,ssh-agent不再自动加载之前加载的ssh密钥。这是苹果有意为之的,他们想重新与主流的OpenSSH实现一致。[1]


正如这里所解释的那样,这是从macOS 10.12.2开始推荐的方法:

1.在你的~/.ssh/config文件中添加以下行。

  1. 使用 ssh-add /path/to/your/private/key/id_rsa 命令添加到 ssh-agent 的任何密钥都会被自动添加到钥匙链中,并且应该在重启时自动加载。

以下内容已被废弃(保留以供参考)。

要想回到以前的行为,你会想在登录时运行ssh-add -A命令(该命令会自动加载钥匙链上所有具有通行密码的ssh密钥)。要做到这一点,请按照以下步骤进行。

1.首先,使用ssh-add -K /absolute/path/to/your/private/key/id_rsa命令将所有你想自动加载的密钥添加到ssh-agent中。-K参数确保密钥通行密码被添加到macOS的keychain中。确保你使用了密钥的绝对路径。使用相对路径会使自动启动的脚本找不到你的钥匙。

  1. 确保当你输入ssh-add -A时,你所有的钥匙都显示为已添加。

  2. com.yourusername.ssh-add.plist中创建一个名为~/Library/LaunchAgents/的文件,内容如下。像这样的列表文件launchd在你登录时用来运行脚本的。[2] [[3]](http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//appleref/doc/uid/10000172i-SW7-BCIEDDBJ)

  3. 告诉launchd通过执行加载你刚刚创建的plist文件launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

然后你应该就可以了。

34
34
34
2017-01-05 18:53:54 +0000

有一个比 Ricardo 的答案 更简单的方法,可以在运行 10.12 Sierra 的 Mac 上,在不同的会话/重启之间坚持你的密码。

  1. ssh-add -K ~/.ssh/id_rsa 注意:更改你的id/rsa密钥所在的路径。
  2. ssh-add -A
  3. 创建(或编辑,如果存在)以下~/.ssh/config文件。

苹果特意改变了macOS 10.12 Sierra中ssh-agent的行为,不再自动加载之前的SSH密钥,这在 OpenRadar Twitter讨论 苹果技术说明中都有提到。上面的解决方案将模仿El Capitan的旧行为并记住你的密码。

17
17
17
2009-12-28 17:37:32 +0000

为了工作,$SSH_AUTH_SOCK环境变量应该指向/tmp/launch-xxxxxx/Listeners。这应该是在你登录时自动完成的。该套接字上的监听器说的是ssh-agent协议。

你的bash脚本启动了你自己的ssh代理(拼写为ssh-agent,而不是ssh/_agent),并覆盖了登录时为你设置的现有ssh-agent

另外,钥匙链的重点是存储ssh密钥的密码,但你说你没有在这些密钥上设置密码,所以我不知道你对钥匙链的集成有什么期望。

最后,当你第一次登录时,你可能不会看到一个ssh-agent进程。当有东西第一次试图读取/tmp中的那个socket时,那个进程会被启动服务自动启动。

10
10
10
2011-04-28 13:28:40 +0000

注:对于macOS Sierra,请参考最新的【ChrisJF的答案】(https://superuser.com/a/1163862/69517)。

[Jeff McCarrell的回答][2]是正确的,只是添加pass短语的命令包含了一个恩破折号而不是连字符,即–K而不是-K,导致消息的内容为–K: No such file or directory。应该是:

ssh-add -K [path/to/private SSH key]
```。
6
6
6
2013-10-14 12:29:41 +0000

我在尝试使用客户端ssh证书登录时也遇到了类似的问题。在这个特殊情况下,它是用来访问git仓库的。情况是这样的。

  • 密钥被保存在~/.ssh/
  • 私钥有一个口令。
  • 密码被保存在 OS X 登录密钥链中。~/Library/Keychains/login.keychain
  • 连接如下:我的mac ->远程mac -> git/ssh服务器
  • Mac OS X 10.8.5

当我使用远程桌面连接到远程mac时,我没有问题。但是当我用SSH连接到远程mac时,每次都被要求输入ssh密码。下面的步骤为我解决了这个问题。

  1. security unlock-keychain 密码被存储在登录钥匙链中。这样就可以解锁它,使ssh-agent能够访问它。
  2. evalssh-agent -s`` 启动ssh-agent以使用shell。它将从密钥链中获取密码,并使用它来解锁私人ssh密钥。
  3. 建立ssh/git连接,做我的工作。
  4. evalssh-agent -k``杀掉正在运行的ssh-agent。
  5. security lock-keychain再次锁定钥匙链。
6
6
6
2009-12-28 12:55:13 +0000

我怀疑你没有使用默认的ssh命令。你是否通过端口安装了ssh?试试which ssh看看你用的是哪条ssh命令。

如果你的钥匙链中还没有存储密码,通常会显示一个对话框询问你的密码。

4
4
4
2014-03-26 09:45:49 +0000

另请参见。

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

……由于有人要求提供更多细节,所以添加了这个说明:"security “命令能够直接将密钥(和其他东西)导入钥匙链。好处是与ssh-add不同,你能够指定keychain。这样就可以直接导入系统中的Keychain("man security "可以了解如何导入)。

1
1
1
2017-01-26 10:39:16 +0000

最好的和苹果打算的解决方案(自从macOS 10.12.2)被描述这里

所以只需做以下工作。

echo “UseKeychain yes” \ > ~/.ssh/config