SSH代理转发不起作用。

43

我在尝试配置Capistrano 3.1以部署托管在Github上的应用程序时遇到了困难。

我正在遵循Capistrano文档,并已成功完成第一步(从工作站到服务器的SSH密钥)以及第二步(从我们的服务器到存储库主机),我能够成功运行ssh -A deploy@one-of-my-servers.com 'git ls-remote git@github.com:my_user/my_repo.git'

18f38afz261df35d462f7f4e2ca847d22f148a06    HEAD
18f38afz261df35d462f7f4e2ca847d22f148a06    refs/heads/master

然而,ssh deploy@one-of-my-servers.com 'git ls-remote git@github.com:my_user/my_repo.git' 失败了:

Permission denied (publickey).

Capistrano文档建议:

如果你收到“host key verification failed.”的错误,请登录服务器并以部署用户身份运行命令ssh git@github.com,以将github.com添加到已知主机列表中。

因此,我尝试了以上操作但是我得到了...

ssh git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
Permission denied (publickey).

我基本上无法成功访问Github存储库。

SSH文档指出:

-A      Enables forwarding of the authentication agent connection.  This
         can also be specified on a per-host basis in a configuration
         file.
我如何在配置文件中按主机指定设置?
我的本地机器运行Mac OSX Mavericks。VPS运行Ubuntu 12.04。
谢谢。

请查看另一个可能的原因(和解决方案):https://serverfault.com/questions/404447/why-is-ssh-agent-forwarding-not-working#answer-1032309 - Vincent Yin
仅供参考,域名example.com专门用于此类情况。因此,每当您需要一个示例域时,可以使用example.com并确保您没有使用实际域,并遵循ICANN准则。ssh -A deploy@one-of-my-servers.com - Stijn de Witt
5个回答

85

您是否已将SSH密钥添加到代理身份列表中?

您可以使用ssh-add -L命令进行检查,您应该能看到用于连接GitHub的密钥:

$ ssh-add -L
ssh-rsa AAAAB3N.....0VmSiRvTzBrbU0ww== /Users/youruser/.ssh/id_rsa

如果您在GitHub上没有看到您使用的SSH密钥或者看到以下消息:

The agent has no identities.

那么您应该通过以下方式添加您的密钥:

ssh-add ~/.ssh/id_rsa

(将路径替换为您在github上使用的密钥的路径)

有关更多信息,请参见ssh-add文档


这解决了我的问题!谢谢!如果这是我的问题,我会接受你的答案。 - Andrew
1
谢谢,这个方法可行!我是否因为复制粘贴密钥文件而不是使用bash命令创建它们而遇到了这些问题? - pastullo

38
请在本地计算机的.ssh/config文件中添加以下行:
  Host Server_Address
     ForwardAgent yes

使用以下命令检查您的本地密钥是否在ssh-add列表中:

ssh-add -L

如果没有将密钥添加到SSH代理中

ssh-add -K

连接远程服务器

ssh -v username@Server_Address

运行以下命令检查是否启用了SSH代理转发。它应该列出一个套接字文件。
echo "$SSH_AUTH_SOCK"

运行连接测试以连接到GitHub

ssh -T git@github.com

运行针对目标Git仓库的ls远程测试

git ls-remote --heads git@github.com:account/repo.git

最后注销并从本地计算机运行以下内容。
cap production git:check

3
很详细的回答!谢谢 - scaryguy
嗯,如果一切都检查过了(SSH密钥已添加到代理并验证,代理转发已在远程主机上启用并验证),但在测试“ssh -T git@github.com”(实际上是在我的特定情况下的“gitlab.com”)时仍然出现“Permission denied(publickey)”,那该怎么办呢?不过这只是在特定的主机上无法工作。 - fritzmg
请查看 https://gitlab.com/gitlab-com/support-forum/issues/171。那里有一些有用的建议。首先运行 ssh -vT git@github.com 以查看更多详细信息。 - Tahsin Turkoz
一个小提示:根据 ssh_config(5),"对于每个参数,将使用第一个获取到的值。" ... 我在我的 ssh 配置中有一个特定于主机的 ForwardAgent yes,我认为它会覆盖我顶部的 ForwardAgent no,但实际上并不是这样!我将 ForwardAgent no 移到了 .ssh/config 的底部,并确认它仍然默认禁用,但现在特定于主机的启用已经起作用了。此外,ssh-add -K 不仅适用于 MacOS,而且可能不被需要。"当添加身份验证标识时,每个密码短语也将存储在您的钥匙串中" - 我不想要那个!你的情况可能有所不同。 - lindes

8
请将以下内容添加到~/.ssh/config文件中:
Host one-of-my-servers.com
    ForwardAgent yes

谢谢您的回复。不幸的是,我忘记提到我已经添加了以下内容:Host 111.222.222.44:24566 ForwardAgent yes - Sig

2

另一个可能的原因是:如果目标主机的指纹与您的~/.ssh/known_hosts不匹配,SSH会自动禁用代理转发。

解决方法如下:

$ ssh -A -o UserKnownHostsFile=/dev/null  my-target-host

1
你可能只需要使用 ssh-keyscan 命令添加主机密钥。 - Tamir Daniely
当您计划稍后手动执行“ssh”时,“ssh-keyscan”将是一个不错的解决方案。对于包含“ssh”的自动化作业(cron作业,CI/CD管道脚本等),您不希望处理“ssh-keyscan”。 - Vincent Yin
1
对于自动化工作,您想要验证指纹或使用SSHFP / SSH证书。覆盖安全检查从来不是一个好主意。 - Tamir Daniely

0
我不完全确定为什么,但以前使用ForwardAgent yes似乎就足够了。我必须额外添加AddKeysToAgent yes才能使其正常工作。这基本上自动化了ssh-add的功能。所以对于这个问题可能比迄今为止的回答更好的答案可能是:
Host Server_Address
   ForwardAgent yes
   AddKeysToAgent yes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接