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

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

eval `ssh-agent`
ssh-add ~/.ssh/some_key_rsa
ssh user@server


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

使用钥匙串有更好的方法吗?

评论

我这样做是为了解决问题,请参考:unix.stackexchange.com/a/560404/388990希望它能起作用,谢谢

答案冗长而令人困惑,需要进行编辑。 apple.stackexchange.com/questions/48502/…这里有一个简短而甜蜜的两步回答,这对脑筋急转弯的熊来说更好。

#1 楼

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

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

此外,钥匙串的重点是将密码存储到您的ssh钥匙,但是您说您没有在这些钥匙上设置密码,所以我不确定您是什么

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

评论


谢谢。因此,我仍然必须运行ssh-add将RSA身份添加到登录时启动的默认ssh代理中?

–约翰·托普利
09年12月28日在18:01

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

–Rudedog
09年12月29日下午5:46

每次我运行ssh时都会提示我输入密码。关键是我不想输入任何密码。

–约翰·托普利
09年12月29日上午10:40

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

–Rudedog
09年12月29日在16:08

使用ssh -v诊断ssh在做什么。还可以在服务器端使用sshd -p 8900 -v和ssh -v remote:8900来诊断sshd在做什么。

–Rudedog
09年12月30日在16:54

#2 楼

从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


评论


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

– Neeme Praks
15年4月24日在8:27

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

–Ludovic Kuty
16年2月14日在8:04

有趣的是,在我的macOS Sierra中,重新启动后它不询问密码,但是ssh-add -l返回“该代理没有身份。” (ps aux包括/ usr / bin / ssh-agent -l)。

–HalilÖzgür
16年11月23日在9:54

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

–schieferstapel
16-12-29在21:05

ssh-add -K ..还需要记住或添加到启动脚本中的另一件事:-)

–user260758
17年5月8日在8:27

#3 楼

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


如此处所述,这是自macOS 10.12.2起的推荐方法:



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

Host *
    UseKeychain yes
    AddKeysToAgent yes


使用ssh-add /path/to/your/private/key/id_rsa命令添加到ssh-agent的任何密钥都将自动添加到钥匙串中,并且应在重新启动后自动加载。


已弃用以下内容(仅供参考)。

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


首先,添加所有要自动进行的密钥使用ssh-add -K /absolute/path/to/your/private/key/id_rsa命令将其加载到ssh-agent。 -K参数可确保将密钥密码短语添加到macOS的密钥链中。确保使用密钥的绝对路径。使用相对路径将使自动启动的脚本找不到您的密钥。
确保键入ssh-add -A时,所有密钥都显示为已添加。

在其中创建一个名为com.yourusername.ssh-add.plist的文件~/Library/LaunchAgents/及其以下内容。 launchd会在登录时使用诸如此类的plist文件来运行脚本。[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>


告诉launchd加载您刚刚使用的plist文件通过执行以下命令创建:launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist

您应该已经全部设置好。

评论


相关:apple.stackexchange.com/questions/48502/…

–slm
17年5月15日在14:09

#4 楼

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



ssh-add -K ~/.ssh/id_rsa
注意:将路径更改为id_rsa密钥所在的位置。

ssh-add -A

创建(或编辑,如果存在)以下~/.ssh/config文件:

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


现在,密码将在两次重启之间被记住!


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

评论


太棒了,工作就像一种魅力,恕我直言,比其他人更清洁,并在正确的地方解决了问题:)

– GerardJP
17年1月10日在15:08

相关:运行ssh-add -K将SSH密钥添加到Apple钥匙串后,Keychain Access.app中显示的条目名称和类型是什么?

–罗勒·布尔克
18/12/8在2:54

但是,如果您确实想自动加载密钥,则仍然需要LaunchAgents plist。

– David Moles
20年11月2日,17:52

#5 楼

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

[Jeff McCarrell的答案] [2]是正确的,除了添加密码的命令中包含一个破折号而不是连字符,即–K而不是-K,从而导致出现一条消息,表明–K: No such file or directory的效果。
应显示为:

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


评论


这应该是您所参考答案的注释,而不是新鲜的答案。我们在这里谈论安全性。有人建议您应该仔细输入,而不是盲目地复制和粘贴ssh-add -K

– Phil_1984_
16-09-20在21:22



使用带有K的连字符,我得到了非法选项-K。小写字母k被列为选项。

–山姆·达顿
16年11月10日在14:16

感谢您的反馈。我刚刚检查了macOS Sierra:-K(即破折号-K)仍然有效

–simonair
17年8月13日在15:41

如果您获得了非法选项-K,则可能使用的是与系统不同的ssh-add。尝试/ usr / bin / ssh-add -K...。请参阅help.github.com/en/github/authenticating-to-github/…

– monozok
19/12/23在8:45

#6 楼

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

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

评论


我没有使用端口。

–约翰·托普利
09年12月28日14:56

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

–ggustafsson
2012年10月6日13:47

#7 楼

尝试使用客户端ssh证书登录时,我遇到了类似的问题。在此特定情况下,它用于访问git存储库。就是这种情况:


密钥已保存在~/.ssh/

私钥具有密码。
密码存储在OS X登录名中钥匙扣。 ~/Library/Keychains/login.keychain

连接如下:我的Mac ->远程mac -> git / ssh服务器
Mac OS X 10.8.5

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



security unlock-keychain密码存储在登录钥匙串中。这会解锁它,并使ssh-agent能够访问它。

eval `ssh-agent -s`启动ssh-agent以供外壳使用。它将从钥匙串中获取密码,并用它来解锁ssh私钥。
建立ssh / git连接并完成我的工作。

eval `ssh-agent -k`杀死正在运行的ssh-agent。

security lock-keychain再次锁定钥匙扣。


评论


为了使#2在别名中为我工作,我必须对每个Re:远程登录和钥匙串使用eval \ $(ssh-agent)。如果不在别名中,则eval $(ssh-agent)有效(不带反斜杠$)。

–特拉维斯
15年7月22日在4:59



#8 楼

另请参见:

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


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

评论


您能给这个答案更多细节吗?谢谢。

–马修·威廉姆斯(Matthew Williams)
2014年3月26日上午10:14

#9 楼

此处描述了Apple最好的最佳解决方案(自macOS 10.12.2起)

所以只需执行以下操作:
回显“ UseKeychain yes” >>〜/ .ssh / config


评论


如果多次输入命令,使用>>会有危险。如ChrisJF答案所述,最好做一个文件的手动版本。

–Cœur
17年1月30日在6:03

是的,你在那里

–本
17年2月2日在18:37