Ubuntu 16.04 ssh:sign_and_send_pubkey:签名失败:代理拒绝操作

我刚刚将我的Ubuntu系统从15.10升级到16.04,完全清除了系统中的Ubuntu 15分区。
在安装Ubuntu 16.04后,由于我忘记备份,所以重新创建了我的ssh密钥,但每当我尝试使用ssh时,都会出现“sign_and_send_pubkey: signing failed: agent refused operation”这个错误。这有点烦人,因为它允许我连接到我的ssh服务器,但git拒绝使用ssh推送代码。
我已经通过使用“ssh-copy-id”命令将密钥推送到服务器上。
我正在连接的服务器是一个通过“do-release-upgrade”命令升级到Ubuntu 16.04的服务器。非常感谢任何帮助。
20个回答

看起来已经有一个ssh-agent在运行,但它找不到任何附加的密钥。要解决这个问题,请将私钥添加到身份验证代理中,方法如下:
ssh-add

然后你可以通过ssh登录到你的服务器。
此外,你还可以通过以下方式查看当前添加的所有身份指纹列表:
ssh-add -l

3不是-1(数字<one>),而是在你的第二个命令中是-l(小写L)。 - Daniel Alder
6@Daniel Alder 确实是小写字母 l - Ron
你是对的,抱歉。问题出在字体“Liberation Mono”的小写字母L :-( - Daniel Alder
2我认为你不应该使用ssh-add,除非使用ssh-add -l,因为这样会在ssh-agent中产生太多条目。没有必要手动添加。Dash > Startup Applications显示ssh-agent已经在运行,并且它会自动检测文件,如~/.ssh/id_rsa~/.ssh/id_rsa.pub。为了证明这一点,你可以在使用ssh-keygen之前和之后使用ssh-add -l。你会发现它会监视这些文件,所以你不需要手动添加它们。 - H2ONaCl
1同样,不要使用ssh-add -dssh-add -D来进行手动删除。只需删除密钥文件~/.ssh/id_rsa~/.ssh/id_rsa.pubssh-agent将会注意到。为了证明,您可以在删除密钥文件之前和之后执行ssh-add -l命令。 - H2ONaCl
我在Windows上的Bitvise SSH服务器遇到了相同的问题。上述方法对于OpenSSH客户端对我有效。 - edib
我觉得很奇怪,我在使用 ssh -i .ssh/id_rsa-myNewKey.pub remotes_server_adress -p myPort -l root 的同时,还需要明确地添加我的新密钥。 - St3an
你简直就是我的英雄! - Barry Michael Doyle
4在添加之前,我不得不将我的密钥权限更改为0400。 - pensan
太棒了!完美无缺! - Paulo
使用ssh-add命令,明确地添加了我所需的密钥google_compute_engine。 - Sridhar Thiagarajan

简单解决方案

我在Ubuntu 18.04上遇到了同样的问题。这完全是关于客户端的私钥权限

$ ssh root@192.168.1.1
sign_and_send_pubkey: signing failed: agent refused operation

文件权限太开放(0644)。
以下命令解决了这个问题:
chmod 600 ~/.ssh/id_rsa

3如果您正在使用Ed25519,请执行以下操作: chmod 600 ~/.ssh/id_ed25519 - Jose Raul Barreras
5这是正确的答案,如果有人因为将密钥从一台计算机复制到另一台计算机而来到这里。这就是我个人的情况。 - m4l490n
1我曾经遇到完全相同的问题,这个方法解决了我的问题。只是需要补充一点,即使你有超过600的数值也不会起作用,至少对我来说是这样。所以只需将它们设置为600。顺便提一下,.ssh文件夹要设置为700。 - Can Sürmeli
我从其他位置复制了备份,并且它以 644 写入。恢复 .ssh 文件夹的备份时,请始终使用 rsync。 - qba-dev
1600表示这个密钥只能由所有者进行读写操作。 - logbasex
1这个答案应该被标记为正确答案。 - fahim152
1确实,ssh-add 命令的 man 页面上写道:身份文件不应该被除用户之外的任何人可读。请注意,如果身份文件可以被其他人访问,ssh-add 将忽略这些文件。 - Jeyekomon
1请注意,您必须对所有密钥进行chmod操作,而不仅仅是您正在使用的那个。如果您有多个密钥,请对它们全部进行chmod操作。 - Peter
1非常感谢!事实上,当我从旧电脑复制ssh文件时,我忘记了文件模式(可执行或不可执行,访问权限等)。 - Erik Brendel
对我来说,这很有效。谢谢。 - Alihossein shahabi

我遇到了同样的问题(相同的症状)。
sam@xxxxx:~/.ssh$ ssh centos@123.123.123.123
sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

...但解决方案却不同。

问题出在使用GNOME-KEYRING上。有关解决方案的帖子可以在这里阅读here

简而言之:

  1. 通过在ssh命令前添加SSH_AUTH_SOCK=0来检测问题。 sam@xxxxx:~/.ssh$ SSH_AUTH_SOCK=0 ssh centos@123.123.123.123
  2. 如果成功连接,请打开应用程序“启动应用程序”(例如使用桌面的搜索功能),并禁用gnome-keyring的使用。
  3. 重新启动

该页面提供了其他细节,以防出现类似问题但解决方案不同的情况。


25你的解决方案对我来说只有一半起作用(不同的问题但症状相似)。使用第一步时,我收到了错误信息“'.ssh/id_rsa' 的权限 0775 过于开放”。这里的简单解决方案是执行命令 chmod 600 .ssh/id_rsa - Matt
3这还有助于调试不仅是 ssh shell 连接,也包括 git ssh auth。在执行 git pull 前使用了命令 SSH_AUTH_SOCK=0,像 Matt 一样收到了权限警告。 - MainActivity
对我也起作用了。显然,原因是我修改了密钥中的注释,很可能是GNOME密钥环代理(也称为SeaHorse)仍然在内存中保留了旧版本。 - maoizm
+1 对于检查是否与GNOME密钥环有关的方法。 - silverdr
我的最初问题是,我首先从模板中获得了一组密钥,然后在命令行上生成了自己的密钥。然后,例如git pull对我失败了。通过使用=0前缀文本使其正常工作,我意识到了gnome-keyring的问题。尝试了其他帖子中给出的解决方案后,问题得到了解决。命令如下: eval ssh-agent -s ssh-add - Alexander Stohr

当我登录几个服务器时,出现了“sign_and_send_pubkey: signing failed: agent refused operation”的错误提示。我阅读了VonC在Stack Overflow上的回答以获取更多关于相关错误的信息。对我来说,解决方案是移除“gnome-keyring”,从“ssh-agent”中删除身份,并重新启动。
sudo apt-get autoremove gnome-keyring
ssh-add -D

然后我所有的钥匙都开始完美地工作。
没有卸载密钥环的临时解决方案
如果您想保留本地计算机上的gnome-keyring并且遇到了代理拒绝操作错误,请使用:
eval `ssh-agent -s`
ssh-add

或者使用SSH_AUTH_SOCK=0 ssh your-server

无需卸载密钥环的永久解决方案

如果可以的话,gnome-keyring与4096位RSA密钥兼容,只需生成一个新密钥:

ssh-keygen -t rsa -f ~/.ssh/your-key-name -b 4096 -v -C root

上传公钥到服务器:
ssh-copy-id -i ~/.ssh/your-key-name.pub root@12.34.56.78

将SSH密钥添加到代理程序中:
ssh-add ~/.ssh/your-key-name

这应该可以正常工作,无需任何额外的修改,gnome-keyring 可以保持安装。
-C [用户名] 是可选的,但对于像 Google Cloud 这样的提供商是必需的。)

2是的,但这将移除所有ssh-agent功能,而这些功能非常有用。 - Martin Konecny
因为Keyring是GNOME的一部分,通常不会在服务器上安装,所以将Keyring保留在您自己的本地PC上。 - Mike
1@MartinKonecny嗯,它只是移除了GNOME提供的ssh代理,而不会移除普通的控制台ssh-agent(如果你已经安装了它)。问题在于GNOME版本会干扰正常的ssh-agent。你仍然可以在控制台/Shell上启动ssh-agent并输入私钥密码。 - blubberdiblub
如果您已经设置为自动登录到您的桌面环境而无需输入密码,那么这个方法就适用,因为这样实际上您的 gnome-keyring 将不会被解锁。 - xjcl
这对我来说很有用!谢谢你! - linjiejun

升级到Ubuntu 18.04后,我遇到了相同的错误sign_and_send_pubkey: signing failed: agent refused operation。原来是由于ssh密钥的权限过于开放所致。 以下命令解决了我的问题 chmod 600 .ssh/id_rsa

在我的系统上(也是Ubuntu 16.04,尝试连接到github),我在我的.ssh文件夹中有一个名为id_ed25519的文件,这导致了ssh-add命令失败。
$ ssh-add
Identity added: ~/.ssh/id_rsa (~/.ssh/id_rsa)
Could not add identity "~/.ssh/id_ed25519": communication with agent failed

删除文件~/.ssh/id_ed25519*(不再需要它们了,这是之前的一个测试),一切都恢复正常了。

2如果你真的需要它们呢? - Gringo Suave
@GringoSuave 好问题。你尝试过了吗?也许格式变了,或者ssh不再支持该格式,或者这是一个bug。就我个人而言,我很高兴我没有不得不去测试它…… - Daniel Alder
仍然无法正常工作,我没有解决方案:Could not add identity "~/.ssh/id_ed25519": communication with agent failed,据我所知代理已经运行并配置好了。 - Gringo Suave
2@GringoSuave 这里的解决方法也是摆脱 Gnome 认证代理,该代理会将一个代理套接字强制插入你的 shell 中,取代普通的 ssh-agent 套接字。普通的 ssh-agent 能够处理 ED25519 密钥,而 Gnome 认证代理则不能(除了它引发的其他问题)。请参考 sam 的回答 https://askubuntu.com/a/835114/167846 或者 Mike 的回答 https://askubuntu.com/a/762968/167846。 - blubberdiblub

我刚安装了Ubuntu16.04,也遇到了类似的问题。在按照Github上的说明将我的公钥复制到Github后,尝试从Github克隆我的存储库时,进行了以下检查(Github.com建议):
ssh -T git@github.com

我被以下内容所欢迎:

sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey).

为了快速修复它,不需要移除任何东西或更改我的启动配置,我只是在终端中输入了以下内容:
killall gnome-keyring-daemon

然后克隆工作了。我接着通过输入以下命令重新启动停止的守护进程:
gnome-keyring-daemon

后来,为了以更持久的方式改变事物,我遵循了这里的建议。

因为我的私钥设置了密码,所以出现了这种情况。我不得不运行ssh-add命令,然后它会要求输入密码并正确地添加私钥。但是现在,在使用SSH登陆机器时,它不再要求输入密码了。

升级Fedora 26到28后,我遇到了同样的问题。 而且没有日志文件。
no /var/log/secure
no /var/log/messages

antop@localmachine  ~  ssh root@ocp1.example.com
sign_and_send_pubkey: signing failed: agent refused operation
root@ocp1.example.com's password:

错误信息没有指出实际问题。问题已经解决。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

gpg-connect-agent updatestartuptty /bye,然后再试一次。


虽然这个回答可能解决了问题,但如果你能在代码周围提供一些背景信息会更好。 - Mark Kirby