Сообщение об ошибке
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-агент подписать challenge аутентификации — и агент отказался. Ключ существует, и сервер принял бы его; не выполнена сама операция с закрытым ключом. Агенты отказывают, когда им нужно действие пользователя, которого они не могут получить (подтверждение, PIN, касание), или когда ключевой материал за ключом из списка больше непригоден.
Почему это происходит
Агенту нужно подтверждение, которое он не может показать
частоКлючи, добавленные через `ssh-add -c`, агенты 1Password/Bitwarden/Secretive, которые запрашивают одобрение, или запросы связки ключей macOS, когда ssh запущен внутри SSH-сеанса, в контейнере или без графического сеанса (нет `SSH_ASKPASS`).
Аппаратный токен или gpg-agent не может подписать
частоYubiKey или смарт-карта, которую извлекли или которой не коснулись вовремя, заблокированный PIN-код PIV или gpg-agent без работающего pinentry (нет `GPG_TTY`). Агент по-прежнему показывает ключ в списке, но использовать его не может.
Ключ в агенте не совпадает с файлом ключа
иногда`-i ~/.ssh/key` с файлом `.pub` от другого ключа или ключ, заменённый на диске, пока в агенте остаётся старый. Ошибку устраняет повторная загрузка ключа в агент.
Как исправить
- 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.
Дайте gpg-agent терминал для запросов
Когда gpg-agent обслуживает SSH-ключи, он показывает запросы PIN-кода на том 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