如何解决“sign_and_send_pubkey: signing failed: agent refused operation”错误?

319

配置新的 Digital Ocean droplet 使用 SSH 密钥。当我运行 ssh-copy-id 时,我得到以下输出:

ssh-copy-id user@012.345.67.89
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
sign_and_send_pubkey: signing failed: agent refused operation
user@012.345.67.89's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@012.345.67.89'"
and check to make sure that only the key(s) you wanted were added.

但是,当我尝试进行ssh连接时,发生了这种情况:

ssh user@012.345.67.89
sign_and_send_pubkey: signing failed: agent refused operation
user@012.345.67.89's password: 

输入密码后,我可以正常登录,但这显然违背了首次创建SSH密钥的初衷。我决定查看服务器端的ssh-agent,以下是我得到的结果:

user@012.345.67.89:~# eval `ssh-agent -s`
Agent pid 5715
user@012.345.67.89:~# ssh-add -l
The agent has no identities.

user/.ssh/authorized_keys中也包含一个ssh-rsa键入条目,但是find -name "keynamehere"返回为空。

26个回答

0

这应该是一个SuperUser的问题。

我在MacOSX SourceTree中遇到了完全相同的错误,但在iTerm2终端中,一切都很顺利。

然而,问题似乎是我有两个运行的ssh-agent ;(

第一个是/usr/bin/ssh-agent(也称为MacOSX的),然后还有HomeBrew安装的/usr/local/bin/ssh-agent在运行。

从SourceTree启动终端,允许我查看SSH_AUTH_SOCK的差异,使用lsof找到了两个不同的ssh-agent,然后我能够将密钥(使用ssh-add)加载到系统的默认ssh-agent中(即/usr/bin/ssh-agent),SourceTree又可以工作了。


0

正如其他人所提到的,这个错误可能有多种原因。

如果您正在使用带智能卡(PIV)的SSH,并使用以下命令将卡添加到ssh-agent中:
ssh-add -s /usr/lib64/pkcs11/opensc-pkcs11.so
则如果PIV身份验证已过期或者您已经拔出并重新插入PIV卡,则可能会从ssh收到错误消息:
sign_and_send_pubkey: signing failed: agent refused operation

在这种情况下,如果您尝试执行另一个ssh-add -s,您仍然会收到错误消息:
Could not add card "/usr/lib64/opensc-pkcs11.so": agent refused operation

根据RedHat Bug 1609055 - pkcs11 support in agent is clunky,您需要执行以下操作:

ssh-add -e /usr/lib64/opensc-pkcs11.so
ssh-add -s /usr/lib64/opensc-pkcs11.so

0
对我来说,问题是将公钥错误地复制/粘贴到Gitlab中。复制生成了一个额外的换行符。确保你粘贴的是一行密钥。

0

另一个原因是 OpenSSH v9.0 的新默认值为 NTRU 素数 + x25519 密钥交换,再加上 gpg-agent(至少在 v2.2.32 上)。

要解决这个问题,可以禁用新的密钥交换算法(因此也就失去了其安全性好处),方法如下:

ssh -o 'KexAlgorithm -sntrup761x25519-sha512@openssh.com' [...]

(或者在SSH配置文件中相同。)

参见https://unix.stackexchange.com/questions/701131/use-ntrux25519-key-exchange-with-gpg-agent


0

只是为了将另一个原因扔到环里...

我的环境被配置为使用Gemalto卡...但我在~/.ssh/中有一个旧的密钥对命名为id_rsa_gemalto_old(.pub),这个名称中包含gemalto,已足以导致git fetch出现sign_and_send_pubkey: signing failed: agent refused operation

(Ubuntu 18.04.6)


0
如果您在代理加载之后更改了加密策略以允许SHA1(例如使用类似update-crypto-policies --set LEGACY的命令),并且远程主机使用SHA1,则需要重新加载代理。
kill $SSH_AGENT_PID
eval $(ssh-agent)
ssh-add

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