跳到主要内容
ecdsa.com
OpenSSH client with an SSH agent (ssh-agent, gpg-agent, 1Password, Secretive, Windows OpenSSH agent)SSH

错误信息

sign_and_send_pubkey: signing failed for RSA "/path/to/key" from agent: agent refused operation

也可能输出为

  • sign_and_send_pubkey: signing failed: agent refused operation
  • sign_and_send_pubkey: signing failed for ED25519 "/path/to/key" from agent: agent refused operation

密钥类型和身份文件路径会有所不同(`RSA`、`ED25519`、`ECDSA-SK` 等)。OpenSSH 8.3 及更早版本输出的是较短的“sign_and_send_pubkey: signing failed: agent refused operation”(已在 7.9 和 8.4 的源代码中核实)。

含义

服务器接受了客户端提供的公钥,于是 ssh 请求 SSH 代理对身份验证挑战签名——而代理拒绝了。密钥存在,服务器也会接受它;没有发生的是私钥运算本身。当代理需要用户交互却无法获得(确认、PIN、触摸)时,或者列出的密钥背后的密钥材料已无法使用时,代理就会拒绝。

原因

修复方法

  1. 1.

    查明是哪个代理在响应,并重新加载密钥

    `SSH_AUTH_SOCK` 指明当前使用的是哪个代理;`ssh-add -l` 列出它持有的密钥。删除密钥再重新添加,可以清除过时的条目。

    bash
    echo "$SSH_AUTH_SOCK"      # which agent answers: ssh-agent, gpg-agent, 1Password, ...
    ssh-add -l                 # keys the agent holds
    ssh-add -D && ssh-add ~/.ssh/id_ed25519   # reload a key that the agent cannot use anymore
  2. 2.

    为 gpg-agent 指定用于提示的终端

    gpg-agent 为 SSH 密钥提供服务时,会在它被告知的 TTY 上显示 PIN 提示;需要从当前 shell 更新这个 TTY。

    bash
    # gpg-agent as SSH agent: tell it which terminal can show the PIN/confirmation prompt
    export GPG_TTY=$(tty)
    gpg-connect-agent updatestartuptty /bye

相关错误

浏览完整的签名错误库