エラーメッセージ
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、タッチ)が必要な場合か、一覧には表示されていても、その鍵の実体(鍵データ)がもう使用できない場合です。
発生する理由
エージェントが確認を求めているが、表示できない
よくある`ssh-add -c` で追加した鍵、承認を求める 1Password/Bitwarden/Secretive のエージェント、macOS のキーチェーンのプロンプトがあるのに、ssh が SSH 経由、コンテナー内、または GUI セッションなし(`SSH_ASKPASS` がない)で実行されている場合です。
ハードウェアトークンや gpg-agent が署名できない
よくある取り外された、または時間内にタッチされなかった YubiKey やスマートカード、ロックされた PIV の PIN、使用できる pinentry のない gpg-agent(`GPG_TTY` が未設定)が該当します。エージェントは鍵を一覧に表示し続けますが、その鍵を使用することはできません。
エージェントの鍵と秘密鍵ファイルが一致しない
ときどき別の鍵の `.pub` ファイルが置かれた状態での `-i ~/.ssh/key` や、エージェントが古い鍵を保持したままディスク上で置き換えられた鍵が原因です。鍵をエージェントに読み込み直せば解決します。
修正方法
- 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 のプロンプトは、gpg-agent に通知された TTY に表示されます。現在のシェルから gpg-agent の 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