【GitHub】Permission denied (publickey) が出た時はだいたいこれで解決できる
GitHub で「Permission denied (publickey)」が出た時の原因特定と対処法
GitHub に新しいアカウントを作成して git clone した際、次のようなメッセージで拒否されることがあります。
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
正しく設定したつもりでも、見落としがあるものです。
原因を特定し、確実に対処しましょう。
GitHub へ SSH 接続する手順
GitHub へ SSH 接続する手順をおさらいします。
- 秘密鍵・公開鍵を作成する
- GitHub に公開鍵を登録する
- 必要ならば、デフォルト鍵を設定する
この手順を終えていることが前提です。
1. 接続確認コマンドで現状を把握する
まずは、現在 GitHub と SSH 接続ができる状態なのかをチェックします。
ssh -T git@github.com
失敗する場合(NG)
SSH 接続ができない場合は、次のようなエラーメッセージとなります。
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
成功する場合(OK)
次のように GitHub から挨拶が返ってくれば、設定は完了しています。
Hi [username]! You've successfully authenticated, but GitHub does not provide shell access.
2. デバッグログで「鍵」を確認する
なぜ接続できないのか、その詳細を SSH のデバッグログ で確認します。
ここで 「どのパスの鍵を見に行っているか」 を確認するのが、解決への最短ルートです。
-v オプションを付けて実行してみましょう。
ssh -vT git@github.com
ログの中に identity file という行を探してください。
identity file に続いて、 SSH 接続時に使用した鍵のファイルパスが示されています。
次では /Users/[user_name]/.ssh/id_rsa が指定されていますが、 type -1 とあり、 「鍵ファイルが見つからない」または「ファイル形式を特定できない」という状態であることがわかります。
debug1: identity file /Users/[user_name]/.ssh/id_rsa type -1
3. ケース別:よくある原因と対処法
秘密鍵がその場所に存在しない
デバッグログで表示されたパスに、本当に鍵ファイルがあるか確認します。
ls -l ~/.ssh
「設定した後にファイル名を変更した」「別のディレクトリで作っていた」というケースが意外と多いです。
秘密鍵と公開鍵のペアが一致していない
ssh-keygen を実行する際、ファイル名を指定せずに実行するとデフォルトの ~/.ssh/id_rsa が上書きされます。
「別の用途で作った鍵を上書きしてしまった」「以前の公開鍵が GitHub に残ったまま」という状態かもしれません。
対処法
GitHub の SSH and GPG keys 設定画面から、現在手元にある公開鍵(.pub)の内容を改めて登録し直してください。
公開鍵に不要な改行や空白が入っている
公開鍵を GitHub へ登録する時に、末尾に不要なスペースや改行が入ると正しく認識されません。
おすすめのコピー方法
# macOS
pbcopy < ~/.ssh/id_rsa.pub
# Windows (Git Bash / PowerShell)
clip < ~/.ssh/id_rsa.pub
エディタで開いてコピーするよりも、上記コマンドを使うのが安全です。
デフォルト以外の鍵名を使っている
~/.ssh/id_rsa(デフォルト)以外の名前で鍵を作成した場合、SSH はその鍵を自動で見つけられません。
一時的な確認方法
-i オプションで鍵を指定して接続できるか試します。
ssh -vT -i ~/.ssh/my_custom_key git@github.com
恒久的な対策
~/.ssh/config に設定を記述します。
~/.ssh/config の設定ミス
設定ファイルを書いているのに反映されない場合、Host の記述ミスを疑いましょう。
修正前 (NG)
Host github
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
修正後 (OK)
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
User git
Host github とだけ書いていると、ssh git@github.com と叩いた時に設定がマッチしません。
まとめ
GitHub との SSH 接続で Permission denied が発生したら、まずはこのコマンドです。
ssh -vT git@github.com
ログから 「どの鍵を使おうとしているか」 を突き止めることが、問題解決の第一歩です。
補足:Connection refused と出る場合
もしConnection refusedと出る場合は、公開鍵の問題ではなく、ネットワーク(プロキシやファイアウォール)が SSH ポート(22)を遮断している可能性があります。
その場合は、HTTPS ポート(443)経由で SSH を利用する方法を検討してください。
※本記事は 2021 年 05 月に公開のブログ原稿をリライト・移植したものです。
Discussion