EC2 上の自分の Git サーバーへ git push を実行しようとしたときに問題が発生しました。エラーは次のような内容でした。
sign_and_send_pubkey: signing failed: agent refused operation
Permission denied (publickey).
fatal: Could not read from remote repository.
修正時に参照した資料は次のとおりです。
- <http://stackoverflow.com/questions/13363553/git-error-host-key-verification-failed-when-connecting-to-remote-repository>
- <https://chenhuachao.com/2016/05/26/ssh%E5%87%BA%E9%94%99-sign-and-send-pubkey-signing-failed-agent-refused-operation/>
SSH クライアントをセットアップする
まず、.ssh ディレクトリが存在し、安全な権限になっていることを確認します。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
失敗の原因がホスト鍵の検証に関係している場合は、リモートホストを known_hosts に追加します。GitHub の場合は次のようになります。
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts
chmod 600 ~/.ssh/known_hosts
自分の Git サーバーの場合は、github.com をサーバーのドメイン名または IP アドレスに置き換えてください。
次に、まだ SSH キーを持っていない場合は生成します。
ssh-keygen -t rsa -C "user.email"
通常、これにより次のファイルが作成されます。
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
Git 接続を受け付けるリモートアカウントに公開鍵を追加します。GitHub の場合は、id_rsa.pub の内容を GitHub プロフィールの SSH キー一覧に追加します。セルフホストの Git サーバーの場合は、公開鍵をリモートユーザーの ~/.ssh/authorized_keys ファイルに追加するか、次のコマンドを使います。
ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@SERVERNAME
そのキーを使うよう SSH を設定する
SSH 設定を編集します。
vim ~/.ssh/config
次のようなホストエントリを追加します。
Host SERVERNAME
HostName ip-or-domain-of-server
User USERNAME
PubkeyAuthentication yes
IdentityFile ~/.ssh/id_rsa
次に、設定ファイルの権限が正しいことを確認します。
chmod 600 ~/.ssh/config
SSH エージェントを起動する
sign_and_send_pubkey: signing failed: agent refused operation というメッセージは、SSH エージェントが正しく動作していない場合や、キーが読み込まれていない場合に発生することがあります。エージェントを起動し、キーを追加します。
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
読み込まれているキーは次のコマンドで確認できます。
ssh-add -l
接続をテストする
もう一度 git push を試す前に、SSH を直接テストします。
ssh -T git@github.com
セルフホストの Git サーバーの場合は、設定したホストを使います。
ssh -T SERVERNAME
接続できたら、Git コマンドをもう一度試します。
git push
それでも失敗する場合は、Git のリモート URL が HTTPS ではなく SSH を使っていることを確認します。
git remote -v
SSH のリモートは通常、次のいずれかのような形式です。
git@github.com:USER/REPO.git
USERNAME@SERVERNAME:/path/to/repo.git
キーが読み込まれ、ホストが信頼済みになっていて、リモート URL が正しい SSH ホストを指していれば、Permission denied (publickey) は解決するはずです。
