Mensagem de erro
sign_and_send_pubkey: signing failed for RSA "/path/to/key" from agent: agent refused operation
Também aparece como
- 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
O tipo da chave e o caminho do arquivo de identidade variam (`RSA`, `ED25519`, `ECDSA-SK`…). O OpenSSH 8.3 e anteriores imprimiam a forma mais curta “sign_and_send_pubkey: signing failed: agent refused operation” (conferido no código-fonte das versões 7.9 e 8.4).
O que significa
O servidor aceitou a chave pública oferecida, então o ssh pediu ao agente SSH que assinasse o desafio de autenticação — e o agente se recusou. A chave existe e o servidor a aceitaria; o que não aconteceu foi a operação com a chave privada. Os agentes recusam quando precisam de uma interação do usuário que não conseguem obter (uma confirmação, um PIN, um toque) ou quando o material de chave por trás da chave listada já não pode ser usado.
Por que acontece
O agente precisa de uma confirmação que não consegue exibir
comumChaves adicionadas com `ssh-add -c`, agentes do 1Password/Bitwarden/Secretive que pedem aprovação ou solicitações do chaveiro do macOS, enquanto o ssh roda dentro de uma sessão SSH, em um contêiner ou sem sessão gráfica (sem `SSH_ASKPASS`).
O token de hardware ou o gpg-agent não consegue assinar
comumUma YubiKey ou um cartão inteligente removido ou que não foi tocado a tempo, um PIN PIV bloqueado ou o gpg-agent sem um pinentry utilizável (sem `GPG_TTY`). O agente continua listando a chave, mas não consegue usá-la.
A chave do agente e o arquivo de identidade não coincidem
ocasional`-i ~/.ssh/key` com um arquivo `.pub` que pertence a outra chave, ou uma chave substituída no disco enquanto o agente ainda guarda a antiga. Recarregar a chave no agente resolve.
Como corrigir
- 1.
Descobrir qual agente responde e recarregar a chave
O `SSH_AUTH_SOCK` indica qual agente está em uso; o `ssh-add -l` lista o que ele guarda. Remover a chave e adicioná-la de novo limpa entradas obsoletas.
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.
Dar ao gpg-agent um terminal para as solicitações de PIN
Quando o gpg-agent atende chaves SSH, ele mostra as solicitações de PIN no TTY que lhe foi informado; atualize o TTY do agente a partir do shell atual.
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