如何永久保存受密码保护的SSH密钥?


9

我正在使用Awesome Window Manager

如何永久添加带密码的私钥?

受到这里答案的启发,我在〜/ .ssh / config中添加了私钥

〜/ .ssh / config的内容:

IdentityFile 'private key full path'

〜/ .ssh / config的权限: 0700

但这对我不起作用。

如果我在每个会话中手动添加密钥,都可以,但是我正在寻找更优雅的方式(不在.bashrc中)

编辑

  • 使用Gnome经典(无效果)版本。

将SSH密钥添加ssh-copy-if到远程主机后,登录时,在终端(GNOME终端3.0.1)中出现以下提示:

ssh -i .ssh/Password-Protected-Key user@host
Enter passphrase for key '.ssh/Password-Protected-Key':
  • 使用Awesome窗口管理器v3.4.10。我已经gnome-keyring-dameon这样做了,所以我杀死了另一个pid并运行gnome-keyring-daemon --start | grep SOCK(我也在.profile中添加了它)(grep)输出:

SSH_AUTH_SOCK=/tmp/keyring-2LXXXX/ssh

我遵循了完全相同的步骤,同样,我也没有任何GUI ssh-add对话框。

编辑2

我统一从Ubuntu 11.10虚拟机创建了一个新的受密码保护的密钥,但仍然无法获得任何密码提示。

编辑3:看来这无法在Awesome窗口管理器中运行:(以及其他。


1
添加受密码保护的SSH密钥有什么意义?它打败了目标……
MarkovCh1 2012年

3
@Syzygy那么,您是否总是键入来自不同服务和应用程序的密码,或者您正在使用密钥环来使用登录密码来解锁密码?
pl1nk 2012年

还有其他想法/问题吗?赏金宽限期即将结束:-)
ish

@izx我已经检查了您提到的所有内容,并且都符合预期。正如我在更新中提到的那样,我还使用了Gnome。我要提交错误吗?
pl1nk 2012年

您可能会在这里找到一些线索。看来开始的顺序很重要,对于gnome-keyring-daemon来说,到达dbus也很重要。
John S Gruber 2012年

Answers:


2

如果您使用的是Unity或启动gnome-keyring-daemon的会话管理器,则只需使用Seahorse(密码和密钥)来建立密钥,定义其用途,设置密码并将其公共密钥分发给您要与ssh一起使用的计算机。无需终端命令。

您可以通过以下方式创建密码:

  1. 选择“文件”->“新建”,然后选择“安全外壳密钥”。按继续。

  2. 输入描述性名称,然后选择Create and set up

  3. 系统将提示您输入两次密钥短语(第二次输入以确认您没有第一次输入错误。

  4. 输入应该使用公钥的计算机以及您将使用该密钥的计算机上的用户名。公用密钥将被复制到另一台计算机上,并在必要时提示您在该计算机上输入密码。

现在My Personal Keys选项卡将显示密钥。

假设gnome-keyring-daemon在您登录Lightdm时已正确启动,并且由会话管理器再次启动,那么当您第一次在ssh中使用该密钥时,系统将提示您输入密钥短语。在此对话框中,您可以提供Details密钥短语,选择控件并要求登录时将密钥环解锁(自动提供此密钥)。按OK

如果还有另一个可用于登录到远程计算机的密钥,则可能不会以这种方式提示您。

完成此操作后,第一个Seahorse选项卡Passwords将列出密钥名称的“解锁密码条目”。单击“ 密码:登录” 之前的三角形以查看它。


因此,此功能不适用于Awesome WM,我想继续使用Awesome,因此我将继续使用解决方法。
pl1nk 2012年

19

使受密码保护的SSH密钥在会话和重新启动后持续存在

这可能就是您想要的:一次输入密钥密码短语,使其在您登录时便永远可用。它适用于使用Unity或Gnome桌面的大多数用户。

  • 将公钥添加到远程服务器后进行连接时,将显示GUI ssh-add对话框:

    在此处输入图片说明

  • 通过单击三角形展开“详细信息”,您将获得以下内容。默认值为“我注销时锁定密钥环”,这要求您在每个会话中输入一次密码:

    在此处输入图片说明

  • 将其更改为“ 自动解锁...”,无论何时登录,这意味着只要您登录到会话即可使用-它由用户密码“控制”。它将在重新启动后持续存在。

    在此处输入图片说明

  • 一次输入密钥密码就可以了-通过首次成功登录到桌面环境对密钥进行身份验证。


如果您使用的是AwesomeWM

在全新的用户ID中使用全新安装的AwesomeWM进行了测试

  • 默认情况下,AwesomeWM使用ssh-agent

    $出口| grep SSH
    声明-x SSH_AGENT_PID =“ 5479”
    声明-x SSH_AUTH_SOCK =“ / tmp / ssh-fWCKNnPq5440 / agent.5440”
    
  • 要使上述步骤生效,您必须将其gnome-keyring-daemon用作SSH身份验证守护程序,而不是ssh-agent。当您使用lightdm登录时,PAM gnome-keyring-daemon将启动,尝试使用您的解锁密码来解锁登录密钥,但是您必须添加配置以使其保持运行并使用它。

  • 在您的末尾添加以下内容~/.xprofile

      #!/ bin / bash
      评估$(gnome-keyring-daemon --start)
      导出SSH_AUTH_SOCK
      导出GNOME_KEYRING_PID
      导出GNOME_KEYRING_CONTROL
    

~/.xprofile文件中的命令将在启动出色的窗口管理器之前由xsession执行,并将gnome-keyring-daemon --login通过上述环境变量将其与PAM启动的进程绑定。

  • 注销回到lightdm并重新登录,现在ssh user@host,您应该得到上面的弹出窗口-使用这些弹出窗口在〜/ .ssh /中对私钥进行解码,并将私钥保存到gnome-keyring登录密钥环中。

任何窗口管理器/桌面环境的通用解决方案

  • 是使用gnome-keyring-daemon而不是ssh-agent。为此,您需要运行gnome-keyring-daemon 进行初始化,然后ssh-agent启动后执行或完全不启动ssh-agent

  • ssh(实际上是ssh-add)根据SSH_AUTH_SOCK环境变量的值来决定要调用哪个身份验证代理,可以通过键入以下内容进行检查export | grep SOCK

  • 这是形式SSH_AUTH_SOCK=/tmp/ssh-MMFyVlI22130/agent.22130SSH代理 (你希望能够保存你的关键不是)

  • 但形式SSH_AUTH_SOCK="/tmp/keyring-mEQB5g/ssh"GNOME的钥匙圈守护进程 (要)

  • 所以检查的价值,并与检查ps aux | grep keyringGNOME的钥匙圈守护程序正在运行,如果是这样,用的结果初始化gnome-keyring-daemon --start

  • 然后,您可以通过在控制台中键入以下内容来检查关联的已保存身份:ssh-add -l-如果显示“ no agent”,则说明配置gnome-keyring-daemon时出错。


好吧,我还没有看到这个!我可以使用哪个命令,甚至更好地使用此对话框调用的命令?
pl1nk 2012年

@izx在使用时是否有必要使用ssh-add?
John S Gruber 2012年

@JohnSGruber不,只要有私钥~/.ssh,就无需使用ssh-add-对话框将在首次使用时弹出。请注意,这仅在Unity / Gnome中有效-我在聊天中发现OP正在使用AwesomeWM,但该方法不起作用!
ish 2012年

1
@ pl1nk:请在答案结尾处查看AwesomeWM的更新解决方案。
ish 2012年

@izx-感谢您的整体支持,请查看我更新的问题。
pl1nk 2012年

2

解决问题的方法是使用ssh代理。您只需要解锁一次密钥密码,之后该密钥便由代理保存在内存中并自动使用。

  • 使用以下命令生成私钥/公钥对 ssh-keygen -t dsa
  • 将公共密钥复制到远程计算机,通常是〜/ .ssh / authorized_keys(ssh-copy-id用于此目的)
  • ssh-add在登录到远程系统之前运行,这将要求您输入密码并将其存储
  • 登录到远程系统,无需密码

ssh-agent在.net上有很好的描述,例如:

ssh-agent的另一个优点是,如果您使用ssh-agent登录到远程系统,则ssh -A user@domain.name可以进一步将ssh从domain.name计算机切换到包含公钥的第三台计算机,而不必每次都将私钥复制到domain.name计算机(并且永远不会会看到您的私钥,只有一次质询/响应)。


我怎样才能做到这一点?从您发送的说明中不清楚。此外,这与Ubuntu相关吗?
pl1nk 2012年

我已经用详细的说明编辑了帖子
Floyd 2012年

您的解决方案按会话存储密码,在我看来,这与gnome-keyring冲突,正如您在我的答案中看到的那样。
pl1nk 2012年

@ pl1nk:所以您需要将密码存储在各个会话之间-即,每次启动询问一次
ish 2012年

是的,您必须在每个会话中提供一次密码。这是受密码保护的ssh密钥背后的全部思想,除了提供登录后能够访问私钥文件之外的另一层安全性。
弗洛伊德2012年

-1

您可以使用

ssh-add 'filename or fullpath'

如果您的钥匙有一个密码,则会要求您输入密码

那么你可以用密码连接


1
正如我提到的问题,我正在寻找一种更优雅的方法。
pl1nk 2012年

-2

如果要使用私钥,请执行以下操作:

ssh-keygen -t rsa -N ''

然后:

通过scp 复制.ssh/id_rsa.pub到计算机目的地.ssh/authorized_keys

scp .ssh/id_rsa.pub user@remote_machine:~/.ssh/authorized_keys

全做完了。

无需密码即可连接到远程计算机:

ssh user@remote_machine

而且我们没有密码提示。


每次都会不断询问我密钥密码。
pl1nk 2012年

1
可能是因为当您运行ssh-keygen -t rsa -N''时,您输入了密码。因此,当您运行上述命令时,不要输入密码,只需按“ ENTER”键即可。
奥克塔维奥·菲利佩贡萨尔维斯

好吧,我想拥有带密码的钥匙。我更新了我的问题
pl1nk 2012年

1
好的,我不知道为什么您要使用密码。通常,此概念仅用于建立与无需身份验证即可识别客户端计算机的远程计算机的连接。因此,如果不希望出现这种情况,您只需要做的就是执行普通的ssh连接。对?
奥克塔维奥·菲利佩贡萨尔维斯

1
告诉人们在远程计算机上的authorized_keys上复制其公钥有点蛮力……更好的方法是使用ssh-copy-id user @ remotemachine命令,这将是第一次使用密码登录,然后APPEND不会覆盖密钥。
弗洛伊德(Floyd)2012年
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.