Permission denied (publickey) の 対処方法はだいたいこれ

  •  
  •  

GitHub への SSH 接続で Permission denied (publickey) 言われたのだが

GitHub に新しいアカウント作成し、 clone したところ次のメッセージがかえりました。

1git@github.com: Permission denied (publickey).
2fatal: Could not read from remote repository.
3
4Please make sure you have the correct access rights
5and the repository exists.

正しく設定したつもりだったのですがなぜでしょうか ?
原因を探って対処しましょう。

GitHub へ SSH 接続する手順おさらい

GitHub へ SSH 接続する手順をおさらいします。

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

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

GitHub との疎通テストを行う

GitHub と SSH 接続できるかどうかは、次のコマンドでかんたんにチェックが可能です。

1$ ssh -T git@github.com

こちらをターミナルで実行します。

NG パターン

SSH 接続ができない場合は、次のようなエラーメッセージとなります。

1git@github.com: Permission denied (publickey).
2fatal: Could not read from remote repository.
3
4Please make sure you have the correct access rights
5and the repository exists.

OK パターン

SSH 接続に成功すれば次のように GitHub から挨拶がかえってきます。

1Hi [account_name] You've successfully authenticated, but GitHub does not provide shell access.

この挨拶がかってくる状態を目指します。

SSH コマンドのデバッグログで鍵を確認する

ssh コマンドは v オプションを付けることでデバッグログが出力されます。

つまりこうです。

1$ ssh -vT git@github.com

v オプションつきで疎通テストを実行してみましょう。

ズラズラーとログが出てきますが、見るところは identity file だけです。

1debug1: identity file /Users/[user_name]/.ssh/id_rsa type -1

identity file に続いて、 SSH 接続時に使用した鍵のファイルパスが示されています。

上記では /Users/[user_name]/.ssh/id_rsa つまり ~/.ssh/id_rsa が使用されている事がわかります。

ケース別対処法

秘密鍵がそこにあるか ?

鍵ファイルが本当に存在するかどうか、念のため調べてみましょうか。

ls コマンドを実行し、目的のファイルがあれば OK です。

1$ ls ~/.ssh

「そんなことないでしょ」かもですが、つい先日、鍵設定後にリネームしたということがありました。
ないとは思っても、ひとつひとつ丁寧に潰していく姿勢が大事です。

秘密鍵と公開鍵の組み合わせは正しいか ?

SSH 鍵はコマンドで生成します。

1$ ssh-keygen -t rsa

このコマンドはファイルパスを指定しない場合 ~/.ssh/id_rsa を上書きする挙動です。

英語メッセージでわけがわからと、 Enter 連打しませんでしたか ?
そんな感じで実は秘密鍵、公開鍵が上書きされて中身が変わっていた、はありえます。

このケースならば、今存在する公開鍵を GitHub に改めて登録すれば OK ですね。

公開鍵にゴミが入っていないか ?

公開鍵を GitHub へ登録する時にゴミがついていると認識してくれません。

GitHub ヘルプ
GitHub アカウントへの新しい SSH キーの追加
https://help.github.com/ja/github/authenticating-to-github/adding-a-new-ssh-key-to-your-github-account

上記、GitHub ヘルプにも 改行や空白を追加しないでください との記載があります。
ゴミが入らないように pbcopy でクリップボードにコピーする、ということが紹介されています。

1$ pbcopy < ~/.ssh/id_rsa.pub

Windows では GitBash などで pbcopy コマンドを実行すると良さそうです。

使いたい秘密鍵を使っているか ?

SSH はデフォルトで ~/.ssh/id_rsa 鍵を使用します。

たとえば、 GitHub 用に ~/.ssh/github_id_rsa など、別名で鍵を作成した場合は、追加した鍵を指定しなければなりませんね。

-i オプションで鍵指定を追加してみましょう。

1$ ssh -vT -i ~/.ssh/bitbucket/id_rsa git@github.com

-i オプションを付けても、指定した鍵が使われない場合、もしかしたら ~/.ssh/config の設定が悪さをしているかもしれません。

~/.ssh/config の設定をミスしていないか ?

~/.ssh/config に設定を入れているのに、意図した鍵が使用されないということもありました。

具体的に、 ~/.ssh/config の Host をこうしていました。

1$ vim ~/.ssh/cofig
2Host github

.com が抜けているので当然なのですが、 ssh git@github.com ではマッチせず、この設定は読まれません。

対処は、次のようにホスト名を抜けもれなく設定する感じです。

1$ vim ~/.ssh/cofig
2Host github.com

まとめ

GitHub との SSH 接続で Permission denied (publickey) が発生する場合、次コマンドを実行して使用している鍵を確かめてください。

1$ ssh -vT git@github.com

使用している鍵が identity file で確認できます。
そこから、鍵があっているか、古くないか、など次の対処に進むことができます。


当記事は Permission denied (publickey) の対処についてまとめました。

もし、 Connection refused というメッセージであれば、 GitHub にそもそも届いていないため、ここで紹介したものとは別の原因となりそうです。