ssh-add在重启之间不持久


150

我通过以下方式向代理添加了ssh密钥:

$ ssh-add ~/.ssh/id_rsa_mac
Identity added: /Users/alex/.ssh/id_rsa_mac (/Users/alex/.ssh/id_rsa_mac)

重新启动后,代理不再添加此密钥:

$ ssh-add -l
The agent has no identities.

为什么会这样呢?


我现在没有时间完全回答,但是ssh模式下的gpg-agent会做您想要的。尝试使用它代替旧版ssh-agent。如果有帮助,我可以在以后有空的时候尝试扩展它。

@Vality:我怀疑gpg-agent在重新启动后是否会持续存在。
PavelŠimerda2014年

@PavelŠimerda它使用用户密码加密私钥,然后$HOME/.gnupg/private-keys-v1.d在您使用ssh-add添加私钥后立即将其放入。这确实是持久的。好吧,假设您有一个非易失性主目录。

@Vality:那不应该视为安全问题吗?您能否在不使用密码的情况下使用密钥并在不需要任何代理的情况下完成密钥呢?
PavelŠimerda2014年

1
@PavelŠimerda并不是真正的安全问题,因为密钥是使用用户密码加密存储的,每次用户登录时仍需要输入密码以对其进行解密。存储未加密的密钥意味着具有root用户(或窃取了您硬盘的小偷)的用户可以从主目录中窃取它们,如果使用gnupg窃取它们,它们将使用您的密码进行加密,因此毫无用处。

Answers:


174

向代理程序添加密钥是暂时的。它们仅在代理运行时才持续。如果您杀死它或重新启动计算机,它们将丢失,直到您重新添加它们。从ssh-agent手册页:

ssh-agent是一个程序,用于保存用于公钥身份验证的私钥(RSA,DSA,ECDSA)。这个想法是ssh-agent在X会话或登录会话的开始时启动,而所有其他窗口或程序都作为ssh-agent程序的客户端启动。通过使用环境变量,可以在使用ssh(1)登录到其他计算机时找到该代理并将其自动用于身份验证。

该代理最初没有任何私钥。使用ssh-add(1)添加密钥。当不带参数执行,SSH-ADD(1)增加了文件~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/id_ecdsa~/.ssh/identity。如果身份具有密码短语,则ssh-add(1)在终端上要求输入密码短语(如果它具有一个密码短语),或者从小型X11程序(如果在X11下运行)询问密码短语。如果这两种情况都不是,则身份验证将失败。然后,它将身份发送给代理。代理中可以存储多个身份。代理可以自动使用任何这些身份。 ssh-add -l显示代理当前持有的身份。

macOS Sierra

从macOS Sierra 10.12.2开始,Apple为SSH配置添加了UseKeychain配置选项。您可以通过添加UseKeychain yes到中激活此功能~/.ssh/config

Host *
  UseKeychain yes

OSX钥匙串

我没有使用OSX,但是在SuperUser上找到了标题为“ 如何将Mac OS X钥匙串与SSH密钥一起使用 ”的问答

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

因此,您可以使用以下命令将SSH密钥导入到Keychain中:

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

然后,您的密钥应该在启动之间保持不变。

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

  ssh-add -l

来源:超级用户-如何将Mac OS X钥匙串与SSH密钥一起使用?


真?在Linux上,我没有这个问题。每次重新启动计算机时都必须“ ssh-add my_key”吗?
アレックス

2
@Alex如答案所示,代理会自动添加~/.ssh/id_rsa。我猜这是您的密钥文件在Linux上的位置。也有可能您没有使用标准的ssh密钥代理。还有其他一些,例如gnome-keyring-daemon,可能具有不同的行为。
帕特里克

但在Mac上,它的名称为“ id_rsa_mac”。如何使代理自动添加?
2014年

@Patrick:我不确定经典版是否ssh-agent会自动添加任何键。我认为ssh-add是读取标准位置,ssh如果您不使用代理,则读取客户端。
PavelŠimerda'14

5
小旁注,如果您的ssh-add命令无法识别-K标志,则您可能正在使用ssh-add的macports版本...您可以通过指定ssh-add的OSX版本的完整路径来绕过macports版本像这样:/usr/bin/ssh-add -K /path/to/private/key
ChrisR

20

ssh-agent是一个会话服务,为用户临时存储密钥

SSH代理的主要目的是记住使用密码保护的密钥的明文版本。换句话说,密钥存储在使用口令加密的磁盘上,密钥的所有者使用ssh-add或某种GUI工具提供口令,并指示代理记住它,直到会话退出或用户明确要求删除为止。

如果您不使用密码并且不使用代理转发(无论如何对于大多数目的来说都是不安全的),则根本不需要代理。任何SSH客户端都应该能够从磁盘上的标准位置或明确指定的位置读取密钥。

标准位置在手册页中列出ssh(1)

协议版本1的默认值为〜/ .ssh / identity,协议版本2的默认值为〜/ .ssh / id_dsa,〜/ .ssh / id_ecdsa,〜/ .ssh / id_ed25519和〜/ .ssh / id_rsa。

使用非标准位置时,可以使用同一手册页中所述的-i开关,也可以使用ssh所用SSH客户端中的相应选项。


4
+1主张不使用ssh-agent
dg99 2014年

7

塞拉利昂

使用UseKeychain。(我没有尝试过,但这听起来是最正确的解决方案。)

要么

ssh-add -K /your/key
echo ssh-add -A | cat >> ~/.bash_profile

创建一个plist文件,而不是附加到~/.bash_profile

免责声明:正如其他人指出的那样,我不知道将ssh密码存储在钥匙串中有多安全。


我尝试了上述所有方法,但只有一种有效。谢谢!
杜安
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.