git@github.com: Permission denied (publickey). となったので解消方法を調査した

今回の原因は全角スペースが含まれているという凡ミスでした
2023.03.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コーヒーが好きな emi です。

GitHub に SSH 接続するために SSH キーを作成して登録しました。
パスフレーズをいちいち入力しなくてもいいように ssh-agent を有効化してから GitHub に接続できるか確認したところ、git@github.com: Permission denied (publickey). となってしまったので、原因を調査しました。

前提

以下の環境で操作しています。

  • Windows 11
  • Git for Windows をインストールし Git Bash を使用

発生したエラー

ssh -T git@github.com コマンドを使って SSH 経由で GitHub のサーバーに接続し、ユーザーアカウントが正しく認証されているかどうかを確認しようとしたところ、以下のようにエラーになりました。

$ ssh -T git@github.com
no such identity: /c/home/.ssh/XXX-key\343\200\200#\347\247\230\345\257\206\351\215\265\343\201\256\343\203\221\343\202\271\343\202\222\345\205\245\345\212\233: No such file or directory
git@github.com: Permission denied (publickey).

~/.ssh ディレクトリ配下に XXX-key という名前の秘密鍵を置いていたのですが、2 行目で謎の数字が羅列され No such file or directory と表示されています。このエラーから、なんとなく「キーの名前の後ろに全角入っちゃってそうだな」と予想しました。

結論

原因は予想通り ~/.ssh 配下に作成した config ファイルに全角スペースが含まれているのが原因でした。凡ミス…。

~/.ssh/config

# Githubの設定
### XXX-key設定
# - - - - - - - - - - - - 
Host github.com
  User git
  Port 22
  Hostname github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/XXX-key□#秘密鍵のパスを入力
  TCPKeepAlive yes 
  IdentitiesOnly yes

コメントを入力したときに全角になってしまったようです。日本語のコメントはわかりやすいですが、こういったミスが起きやすいので注意しないといけないですね。
config ファイルを修正してもう一度 ssh -T git@github.com を実行すると、無事接続を確認できました。

$ ssh -T git@github.com
Hi emi-ki! You've successfully authenticated, but GitHub does not provide shell access.

もう少し詳細

GitHub との接続を確認する際に実行した ssh -T git@github.com というコマンドには、以下のオプションが含まれています。

  • -T:SSH 接続を介して実行するコマンドがないことを示していて、認証や接続の確認を行う場合に使用されます。
  • git@github.com:SSH 経由で接続するリモートシステムのアドレスを指定しています。git は GitHub への接続に使われるユーザーアカウント名、github.com は接続するリモートホストのアドレスを指定しています。

Permission denied (publickey). となった場合、一般的に以下のような要因が考えられます。当てはまるものがないか確認してみてください。

  • sudo コマンドまたは管理者特権を使用していないか
    • sudo を使用せずに SSH キーを生成して sudo git push のようなコマンドを使用しようとすると、生成したものと同じキーが使用されないためエラーになります。
  • 正しいサーバーに接続していることを確認する
    • 「githib.com」や「guthub.com」になっていないか確認してみてください。
  • 常に「git」ユーザを使用する
    • リモート URL 向けを含むすべての接続は、「git」ユーザとして行われます。
  • 接続に使用する SSH キーが存在することを確認する
  • 公開鍵が GitHub アカウントに設定されていることを確認する

参考