如何在Mac OS X Lion上每次都不用输入密码的情况下使用SSH私钥登录?


23

我每天都使用Mac OS X Lion并通过SSH登录远程主机。尽管我使用SSH密钥对进行远程身份验证,并且我不需要动用每台主机的登录短语,但终端仍然要求提供访问我的SSH私钥的密码,这仍然很令人讨厌。

出于安全考虑,我认为必须使用用于访问SSH私钥的密码。有没有一种方法可以使终端在启动时仅一次询问该短语,然后记住它,并在以后的SSH会话中自动使用我的私钥?

有一个名为的脚本keychain可以在Gentoo Linux上正常工作。但是我从来没有在Mac OS X Lion上弄清楚它。而且,还有许多令人生畏的术语,例如ssh-agentssh-add。在阅读了关于那些SSH工具包的各种材料并进行了一些沮丧的实验之后,我变得更加困惑。

因此,我来​​到StackExchange,以寻求有关以下问题的建议。

  1. 什么是ssh-agentssh-addkeychainKeychain Access.app以及他们如何互相交流?
  2. 如何在登录时为SSH私钥输入一次密码短语,并在以后的SSH会话创建中自由使用它?
  3. Errr ...怎么了Keychain Access.app?它不像以前那样存储SSH短语。

我列出了我在这里所做的事情。希望有关于我错过的步骤的线索。

步骤1.在Mac上创建一个SSH密钥对。

$ ssh-keygen -t rsa -C "me@email.com"
# Set a passphrase for accessing the private key.

步骤2.将我的SSH公钥复制到远程主机。举个例子,我将密钥复制到Mac的localhost。

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

步骤3.然后尝试通过SSH密钥对身份验证连接到远程主机(此处为localhost)。

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

步骤4.从远程主机注销,然后尝试再次连接到它。该死的,终端再次要求输入SSH短语。

一个常见的问题是“ ssh-agent在Mac上工作正常吗?”。坦白说,我不知道这些事情是怎么回事。这里显示一些运行结果。

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

欢迎任何反馈。谢谢!


相关的。您可以根据自己的用例调整可接受的答案。
丹尼尔·贝克

Answers:


12

ssh-agent是您想要工作的一部分,因为它确实满足您的要求。该代理程序作为守护程序运行,当您向其“添加”私钥时,它会记住该私钥并sshd在初始连接期间自动将其提供给远程服务器。(ssh-add只是您运行的手动向中添加私钥的命令ssh-agent)。

在OS X中,从Leopard开始,您不必运行ssh-agentssh-add手动运行。当您尝试连接到服务器时,它应该“只是发生”。每个按键一次,它将通过UI密码对话框提示您,该对话框(除其他外)将使您自动将按键添加到,ssh-agent因此您再也不会得到提示。

这可以通过launchd配置侦听$SSH_AUTH_SOCK套接字上的连接,并ssh-agent在首次需要时自动启动来进行处理。之后,ssh-agent仅在需要打开新密钥时才提示您输入凭据。

如果这不起作用,请确保存在正确的launchd配置文件:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

如果由于某种原因它仍然对您不起作用,这是手工运行事情的“旧”方法:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

还有这个应用程序,自Leopard问世以来,我就停止使用了它,但在以前的Mac OS X版本中基本上做了相同的事情:

http://www.sshkeychain.org/


4
谢谢Michael Edenfield。我弄清楚出了什么问题,现在ssh-login-with-password可以在Mac OS X Lion上完美运行。我做了一些愚蠢的事情-我做了一个符号链接,~/tmp指向它,/tmp/~/tmp每2小时运行一次cron作业进行清理,这也删除了ssh-agent套接字。哦,我讨厌我自己。
W.

13

在解决“问题”的过程中,我GOOGLE了一些相关的主题,并写下有关如何一些笔记ssh-agentssh-addkeychainKeyChain Access.app工作。最终证明,这个问题根本不是问题,而是这个问题全都与我有关,因此所谓的ssh-login-with-asking-passphrase-every-time可以完美地在Mac上使用。

但是,此过程为我带来了一些经验。我在这里写下我的笔记,希望它们能帮助对这些术语感到困惑的人。

两个密码术语:

  • passphrase 是指访问SSH私钥时所需的短语。
  • password 指登录到Mac所需的短语。

现在我可以找出这些工具包做的,那就是 ssh-agentssh-addkeychainKeychain Access.app在Mac上。

  • ssh-agent是在不键入SSH密码的情况下启用SSH私钥的关键服务。ssh-agent以这种方式工作。首先,它将SSH私钥存储或缓存在主内存中。然后,在此会话的稍后时间,当需要使用SSH私有SSH密钥进行远程身份验证时,ssh-agent它将在主内存中找到您的私有密钥,并将其交给远程进程。要求您键入SSH密码的唯一机会是ssh-agent最初添加私钥时。
  • ssh-addssh-agent集合的一部分,它有助于管理中的SSH密钥ssh-agent。我们使用ssh-add命令列出,添加,删除ssh-agent的密钥环中的私钥。然后ssh-addssh-agent服务进行通信以完成任务。
  • keychain是用于查找ssh-agent服务的脚本(如果不存在,请启动一个新脚本)并调用ssh-add以添加SSH私钥。keychain有一个简单明了的想法,可以在Linux上正常工作,而ssh-agent通常不会自动启动。
  • Keychain Access.app似乎是最复杂的组件。它是Mac OS X的通用令牌存储服务。它存储各种令牌,例如密码,证书等,并充当请求令牌的那些应用程序的令牌代理。在我们的SSH私钥案例中,首先,它掌握了访问SSH私钥的请求,并弹出一个窗口,要求您将SSH密码(一种令牌)存储到Keychain Access.app的密钥环中。然后,下次当您要使用私钥进行身份验证时,Keychain Access.app再次弹出一个窗口,询问是否授予特权。得到很大的肯定后,keychain Access.app将您的私钥添加到ssh-agent的存储中。

有两件事值得您注意:

  1. Mac OS X Lion ssh-agent在启动时会自动启动服务,并在下的套接字上监听/tmp
  2. Keychain Access.app存储您的SSH密码,以便它可以将您的私钥添加到其中ssh-agent而不会打扰您。是的,不需要键入您的SSH短语,但是在首次创建此条目时,需要键入您的Mac帐户的登录密码才能授予特权。

因此,总而言之,无需询问就可以使用SSH登录而不需要Mac OSX。


1

如果这里的其他解决方案对人不起作用,以下对我有用。

对于〜/ .ssh目录中的每个私钥,请确保还存在相应的公钥。确保公用密钥的名称与专用密钥完全相同,但.pub末尾带有。如果您已经有合适的公钥,请尝试重新生成它。

如果您需要重新创建公钥,则可以轻松地做到这一点:-

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

my_key您的密钥称为替换。

之后,MacOS会记住钥匙串中的关键密码短语。

注意-输入密码并将其保存为钥匙串现在仅是一次操作(并非每个OP都希望每个登录会话一次),但是假设登录有问题的Mac受密码保护,则您的密码受该登录密码保护。而且,这种解决方案对我来说没有任何意义……除了私钥外,不需要公钥,但由于某些原因,MacOSX要求使用它。

(最初来自对Apple Stack Exchange上类似问题的回答


1

关于配置~/.ssh文件夹,我很少发现提到的一件事是限制目录权限。

为了使ssh避免要求输入密码,我总是必须将用户的主目录权限设置为700,并将~/.ssh文件夹权限设置700为。

否则,即使我正确生成并复制了所有密钥,它仍会继续询问我密码。身份验证日志中会生成一条错误消息,但这在大多数情况下对于最终用户是不可见的。


0

您可以尝试的另一件事是将其替换ssh-copy-idk="$(cat ~/.ssh/id_rsa.pub)"; ssh username@somehost.com "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"


0

这个答案有点不能解决这个问题。但是,它非常接近(我在寻找问题的解决方案时遇到了这个问题)。

我也对我的Mac上的远程服务器做了很多SSH,如该问题所述,但是该Keychain Access.app应用程序确实存储了密钥短语,并且我不需要每次都需要密钥来在SSH服务器上进行身份验证时键入它。

但是,我在Mac上启用了SSH服务器,以便可以远程连接到它。当远程登录Mac时,总是在我要SSH另一台主机时询问密钥短语。

我找到了一种解决方案,可以为当前会话存储密钥短语。我认为这可能对某人有用,因此发布/回答。


我在这里写下了类似的解决方案superuser.com/a/659668/154113
orkoden 2013年

0

我一直在为这个问题感到困惑。ssh适用于我们部门中除苹果外的所有机器(MacBook或iMac无关紧要)。我终于厌倦了输入密码,并决定进行调试。

我去了iMac,并在“共享首选项”面板中禁用了sshd。然后,我进入根目录,并键入“ / usr / sbin / sshd -d”以在调试模式下启动sshd。然后,我尝试通过ssh连接到该计算机,并立即尝试使用协议2,该协议似乎一切都很好,但是sshd迅速报告它找不到“ authorized_keys”。我有一个authorized_keys2文件,我的所有linux,solaris,you-name-it Unix框都可以接受。我只是简单地将authorized_keys2复制到authorized_keys和BOOM。现在可以完美运行。

为什么* keys而不是* keys2是未知的。尤其是当os x对known_hosts2非常满意时。

无论如何,现在我们所有的苹果盒子都可以登录,或在没有爆炸密码的情况下对其执行远程命令:提示...

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.