読者です 読者をやめる 読者になる 読者になる

認証は通っているのにGitでGitHubリモートリポジトリにアクセスすると Permission denied になる問題の原因

Git SSH

発端

先日、.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.pubGitHubに登録した状態で

$ ssh github

とすると

Hi noraworld! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

と表示され、GitHubSSH認証が成功します。

これなら何の問題もないのですが、ぼくはこの前、秘密鍵と公開鍵をまとめるために、defaultというディレクトリを作って、その中にid_rsaid_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です。

とても単純なことですが、ネットでエラーを調べてもこの手の凡ミスを紹介しているサイトは見つからなかったので、同じように悩んでいる人の参考になれば幸いです。