🐈

【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 接続する手順をおさらいします。

  1. 秘密鍵・公開鍵を作成する
  2. GitHub に公開鍵を登録する
  3. 必要ならば、デフォルト鍵を設定する

この手順を終えていることが前提です。

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