認証は通っているのにGitでGitHubリモートリポジトリにアクセスすると Permission denied になる問題の原因
発端
先日、.ssh
内の鍵ファイルを整理してたら、git pull
が通らなくなりました。
git pull
しようとするとこんな感じのエラーが出ます。
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/config
には以下の設定を追加しています。
Host github HostName github.com User git IdentityFile ~/.ssh/id_rsa
~/.ssh/id_rsa.pub
をGitHubに登録した状態で
$ ssh github
とすると
Hi noraworld! You've successfully authenticated, but GitHub does not provide shell access. Connection to github.com closed.
これなら何の問題もないのですが、ぼくはこの前、秘密鍵と公開鍵をまとめるために、default
というディレクトリを作って、その中にid_rsa
とid_rsa.pub
を保存したので、config
の設定を以下のように書き換えました。
Host github HostName github.com User git IdentityFile ~/.ssh/default/id_rsa
この状態でも、認証に使う鍵は同じなので
$ ssh github
とすれば、同じように認証が成功します。
しかし、この状態で、git pull
などすると、認証エラーになってしまいます。
Gitはデフォルトの鍵ファイルを参照する
理由は単純で、Gitは~/.ssh/id_rsa
を認証の鍵として使用するからです。ぼくはGitHubで認証が通ったので、GitHubをリモートリポジトリとして設定したリポジトリでGitを使うときにも同じパスを参照してくれるだろうと思っていました。つまり、GitHubの認証に通っていればGitでも同じくSSHでの認証ができるものと思っていました。
しかし、実際には違って、GitHubとの認証では、たしかにconfig
に書かれた設定を参照しますが、Gitの諸々のコマンドではデフォルトの鍵(~/.ssh/id_rsa
)を参照してしまうので、そこに鍵ファイルがなくてエラーになってしまったというのが原因でした。
なので、解決方法は簡単で、認証に使う鍵を~/.ssh/id_rsa
に置いておけばOKです。
とても単純なことですが、ネットでエラーを調べてもこの手の凡ミスを紹介しているサイトは見つからなかったので、同じように悩んでいる人の参考になれば幸いです。