如何通过SSH密钥使用Mac OS X钥匙串?


140

我了解自Mac OS X Leopard以来,钥匙串支持存储SSH密钥。有人可以解释一下此功能的工作原理。

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

评估`ssh-agent`
ssh-add〜/ .ssh / some_key_rsa
SSH用户@服务器

(我已经编写了一些Bash函数来简化此过程。)

有没有更好的方法可以使用钥匙串做到这一点?

Answers:


16

为了使其正常工作,$SSH_AUTH_SOCK应指向环境变量/tmp/launch-xxxxxx/Listeners。您应该在登录时自动完成此操作。该套接字上的侦听器使用ssh-agent协议。

您的bash脚本正在启动您自己的ssh代理(拼写ssh-agent而不是ssh_agent),并覆盖ssh-agent在登录时为您设置的现有代理。

同样,钥匙串的重点是将密码存储到ssh钥匙,但是您说您没有在这些钥匙上设置密码,因此我不确定您对钥匙串集成的期望。

最后,当您第一次登录时,您可能不会看到ssh-agent进程。首次尝试从中读取该套接字时,启动服务将自动启动该过程/tmp


1
谢谢。因此,我仍然需要运行ssh-add以将我的RSA身份添加到登录时启动的默认ssh代理中?
约翰·托普利

您不必运行ssh-add;第一次运行ssh时,ssh-agent会要求输入密钥的密码。
Rudedog

3
每次我运行ssh时都会提示我输入密码。关键是我不需要输入任何密码。
约翰·托普利2009年

1
是什么提示您输入密码?我开始怀疑是提示您的是远程服务器,这使您可以更好地理解您的密钥没有密码短语。如果要绕过远程服务器上的密码,则需要将公共密钥添加到$HOME/.ssh/authorized_keys该服务器上。Mac OS的ssh-agent + keychain仅用于存储本地ssh密钥的密码。这并不意味着要通过现有的ssh连接发送远程密码。
Rudedog

1
用于ssh -v诊断ssh在做什么。也可以sshd -p 8900 -v在服务器端使用并ssh -v remote:8900诊断sshd在做什么。
Rudedog

252

从OS X Leopard版本开始,ssh-agent与Keychain紧密集成。可以将所有SSH密钥的密码安全地存储在Keychain中,ssh-agent在启动时将从中读取密码。最重要的是,使用密码短语来保护您的密钥很简单,但不必键入密码短语即可使用它们!方法如下:

将通行短语添加到钥匙串的每个ssh密钥:(选项-k仅加载普通私钥,跳过证书)

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

(请注意,这是一个大写的K)

每当您重新启动Mac时,钥匙串中的所有SSH密钥都会自动加载。您应该能够在“钥匙串访问”应用程序中以及通过以下命令从命令行查看密钥:

ssh-add -l

ssh-add -l远程连接(未设置$ DISPLAY)时未列出任何键。这里需要使用特殊技巧来使用钥匙串(例如,在superuser.com/questions/141044/…中
Ether

2
developer.apple.com/library/mac/documentation/Darwin/Reference/… 您还需要-K选项将密码短语存储在钥匙串中。
Neeme Praks

5
如果通过诸如Homebrew之类的软件包系统安装了另一版本的SSH,则必须使用绝对路径/usr/bin/ssh-add
Ludovic Kuty

1
有趣的是,在我的macOS Sierra中,它在重新引导后不要求输入密码,而是ssh-add -l返回“代理没有身份”。(ps aux包括/usr/bin/ssh-agent -l)。
哈利尔·奥兹古尔

4
对于macOS Sierra,情况已经改变。参见github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel

79

macOS Sierra开始,登录到帐户时,ssh-agent不再自动加载以前加载的ssh密钥。这在Apple方面是有意的,他们希望与主流的OpenSSH实施保持一致。[1]


正如解释在这里,这是因为推荐的方法MACOS 10.12.2

  1. 将以下行添加到您的~/.ssh/config文件:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. 使用该命令添加到ssh-agent的任何密钥ssh-add /path/to/your/private/key/id_rsa都将自动添加到钥匙串中,并应在重新引导后自动加载。


不推荐使用以下内容(保留作为参考)。

要返回到以前的行为,您需要ssh-add -A在登录时运行命令(该命令会自动加载在钥匙串上具有密码短语的所有ssh钥匙)。为此,请按照以下步骤操作:

  1. 首先,使用命令将要自动加载的所有密钥添加到ssh-agentssh-add -K /absolute/path/to/your/private/key/id_rsa。该-K参数确保将密钥密码短语添加到macOS的密钥链中。确保使用密钥的绝对路径。使用相对路径将使自动启动的脚本找不到您的密钥。

  2. 确保键入时所有键都显示为已添加ssh-add -A

  3. 创建一个名为文件com.yourusername.ssh-add.plist~/Library/LaunchAgents/有如下内容。登录时,将使用诸如Plist这样的Plist文件launchd来运行脚本。[2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. 通过执行以下命令告诉launchd您加载刚刚创建的plist文件launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist

而且你应该准备好了。



33

有一种比里卡多的答案更简单的方法,可以在运行10.12 Sierra的Mac的会话/重新启动之间保留密码。

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

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    现在,密码将在重新启动之间被记住!

Apple故意将macOS 10.12 Sierra中ssh-agent的行为更改为不再自动加载以前的SSH密钥,如本OpenRadarTwitter讨论Apple技术说明中所述。上面的解决方案将模仿El Capitan的旧行为并记住您的密码。


2
太棒了,工作就像一个魅力,比其他人更清洁,并在正确的地方解决了:)
GerardJP


10

注意:对于macOS Sierra,请参考ChrisJF的最新答案

的[由Jeff McCarrell答案] [2]是正确的,所不同的是命令添加通行短语包含一个短划线代替一个连字符,即–K代替-K,使消息的效果–K: No such file or directory。它应显示为:

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

2
这应该是您所参考答案的注释,而不是新鲜的答案。我们在这里谈论安全性。一个人可能建议您应该小心输入,而不是盲目复制和粘贴ssh-add -K
Phil_1984_

1
对K使用连字符,得到illegal option -- K。小写字母k被列为选项。
Sam Dutton

感谢您的反馈。我刚刚检查了macOS Sierra:-K即dash-capital-K仍然有效
simonair

6

我怀疑您没有使用默认ssh命令。是否ssh通过端口安装?尝试which ssh查看ssh您正在使用哪个命令。

通常,它应该显示一个对话框,要求您输入密码(如果尚未存储在钥匙串中)。


我没有使用端口。
约翰·托普利2009年

感谢您提供的信息:)我遇到了问题,因为我使用的是Homebrew的OpenSSH。
ggustafsson 2012年

6

尝试使用客户端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. eval `ssh-agent -s`启动用于外壳程序的ssh-agent。它将从钥匙串中获取密码,并使用它来解锁ssh私钥。
  3. 建立ssh / git连接并完成我的工作。
  4. eval `ssh-agent -k` 杀死正在运行的ssh-agent。
  5. security lock-keychain 再次锁定钥匙串。

1
为了使#2在别名中为我工作,我必须使用eval \$(ssh-agent)per Re:远程登录和钥匙串。当不在别名内时eval $(ssh-agent)不带反斜杠$)。
特拉维斯

4

也可以看看:

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

...当需要更多详细信息时添加此注释:“安全”命令能够将密钥(和其他东西)直接导入到钥匙串中。令人高兴的是,与ssh-add不同,您可以指定钥匙串。这样就可以直接将其导入系统钥匙串中(“ man security”以了解如何操作)


1
您能给这个答案更多细节吗?谢谢。
马修·威廉姆斯

1

此处描述最佳和Apple预期的解决方案(自macOS 10.12.2起)

因此,请执行以下操作:

回声“ UseKeychain yes” >>〜/ .ssh / config


1
>>如果您多次输入该命令,则使用存在风险。如ChrisJF answer所述,最好做一个文件的手动版本。
心教堂

是的,你就在那里
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.