PERMISSION DENIED (PUBLICKEY).

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) は解決するはずです。

Leave a Reply