据我所知,自 Mac OS X Leopard 以来,Keychain 已支持存储 SSH 密钥。有人能解释一下此功能应该如何工作吗?
我有一些生成的 RSA 密钥存储在 ~/.ssh 目录中,用于访问各种服务器。我没有在这些密钥上设置密码。目前,为了登录这些服务器,我在终端中使用以下命令:
评估`ssh-agent` ssh-添加〜/ .ssh / some_key_rsa ssh 用户@服务器
(我编写了一些 Bash 函数来使这更容易。)
有没有更好的方法可以使用 Keychain 来实现这一点?
答案1
为了使其工作,$SSH_AUTH_SOCK
环境变量应该指向/tmp/launch-xxxxxx/Listeners
。这应该在您登录时自动完成。该套接字上的侦听器使用 ssh-agent 协议。
您的 bash 脚本正在启动您自己的 ssh 代理(拼写为ssh-agent
,而不是 ssh_agent)并覆盖ssh-agent
在登录时为您设置的现有代理。
此外,钥匙串的全部意义在于存储你的 ssh 密钥的密码,但你说你没有在这些密钥上设置密码,所以我不确定你对钥匙串集成有什么期望。
最后,首次登录时,您可能看不到 ssh-agent 进程。启动服务会在首次尝试读取套接字时自动启动该进程/tmp
。
答案2
从 OS X 的 Leopard 版本开始,ssh-agent 与 Keychain 的集成更加紧密。可以将所有 SSH 密钥的密码安全地存储在 Keychain 中,ssh-agent 将在启动时从中读取它们。最重要的是,使用密码保护密钥很简单,但使用它们时无需输入密码!方法如下:
将每个 ssh 密钥的密码添加到钥匙串中:(选项 -k 仅加载普通私钥,跳过证书)
ssh-add -K [path/to/private SSH key]
(注意,K 是大写的)
每当你重启 Mac 时,钥匙串中的所有 SSH 密钥都会自动加载。你应该能够在 Keychain Access 应用程序中以及通过命令行查看密钥:
ssh-add -l
答案3
作为苹果系统塞拉,ssh 代理登录账户时不再自动加载之前加载的 ssh 密钥。这是 Apple 的故意为之,他们希望与主流保持一致OpenSSH执行。[1]
正如解释的那样这里,这是推荐的方法,因为macOS 10.12.2:
将以下行添加到您的
~/.ssh/config
文件中:Host * UseKeychain yes AddKeysToAgent yes
任何添加到ssh 代理使用该
ssh-add /path/to/your/private/key/id_rsa
命令将自动添加到钥匙串,并应在重启时自动加载。
以下内容已弃用(保留以供参考)。
要恢复以前的行为,您需要ssh-add -A
在登录时运行命令(自动加载钥匙串上具有密码的所有 ssh 密钥)。为此,请按照下列步骤操作:
首先,将所有要自动加载的键添加到ssh 代理使用该
ssh-add -K /absolute/path/to/your/private/key/id_rsa
命令。该-K
参数确保密钥密码被添加到macOS 的钥匙串。请确保使用密钥的绝对路径。使用相对路径将导致自动启动的脚本找不到您的密钥。确保输入时所有键均显示为已添加
ssh-add -A
。com.yourusername.ssh-add.plist
创建一个名为的文件~/Library/LaunchAgents/
,内容如下。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>
告诉
launchd
加载plist文件您刚刚通过执行以下命令创建:launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist
。
一切就绪了。
答案4
注意:对于 macOS Sierra,请参阅较新的ChrisJF 的回答。
[Jeff McCarrell 的回答][2] 是正确的,只是添加密码短语的命令包含一个短划线而不是连字符,即–K
而不是-K
,从而导致出现 的消息–K: No such file or directory
。它应该是:
ssh-add -K [path/to/private SSH key]