ローカルで開発していたプロジェクトをGitHubにpushしようとしたところ、エラーが発生しました。

1. 「Permission denied (publickey)」エラー
git pushコマンドを実行すると、次のようなメッセージが表示されました。
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:######
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Code language: PHP (php)
これは初めてGitHubのサーバーに接続する際に必ず出る確認メッセージです。
SSH接続では、接続先のサーバーが本物かどうかを確認する仕組みがあります。
この「フィンガープリント」と呼ばれる文字列が、サーバーの身分証明書のようなものです。
GitHubの公式ドキュメントに記載されているフィンガープリントと一致していることを確認し、yesと入力しました。
yesと答えると、すぐに次のメッセージが表示されました。
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Code language: HTTP (http)
最初の警告メッセージは問題ありません。
GitHubのサーバー情報が~/.ssh/known_hostsというファイルに記録されたことを示しています。
次回以降は、この確認をスキップできます。
しかし、その直後に「Permission denied (publickey)」というエラーが出ました。
これは、SSH公開鍵による認証が失敗したことを意味します。
1.1. SSH鍵認証の仕組み
ここで少し、SSH鍵認証について説明します。
GitHubとの通信には、SSH(Secure Shell)という暗号化された通信方法を使います。
この時、パスワードではなく「鍵」を使って認証を行います。
鍵は2つセットで使います。
1つは「秘密鍵」で、自分のコンピューターだけに保存します。
もう1つは「公開鍵」で、GitHubのサーバーに登録します。
この2つの鍵は数学的に対応しており、秘密鍵を持っている人だけが、公開鍵に対応する本人だと証明できる仕組みです。
今回のエラーは、GitHubに公開鍵が登録されていないか、ローカルに秘密鍵がないことを示しています。
2. SSH鍵を用意してGitHubに登録する
まず、自分のコンピューターにSSH鍵があるか確認しました。
公開鍵の内容を表示するには、

cat ~/.ssh/id_ed25519.pub
Code language: JavaScript (javascript)
すると、ssh-ed25519で始まる長い文字列が表示されるはずです。
この文字列全体が公開鍵です。
この内容をコピーして、GitHubに登録します。

GitHubのウェブサイトで以下の手順を実行しました。
- GitHubにログイン後、Settings(設定)ページを開く
- 左側のメニューから「SSH and GPG keys」を選択
- 「New SSH key」ボタンをクリック
- Titleには識別しやすい名前を入力(例:「作業用マシン」)
- Key欄に、先ほどコピーした公開鍵の内容を貼り付け
- 「Add SSH key」ボタンをクリック
これで、GitHubのサーバーに公開鍵が登録されました。
2.1. もしSSH用の鍵がなければ
ls -la ~/.ssh/id_*.pub
Code language: JavaScript (javascript)
このコマンドは、~/.sshディレクトリ(SSHの設定や鍵を保存する場所)にある公開鍵ファイルを一覧表示します。
公開鍵のファイル名は.pubという拡張子で終わります。
もし、鍵がなければ、新しく生成します。
ssh-keygen -t ed25519 -C "your_email@example.com"
Code language: JavaScript (javascript)
このコマンドで、ED25519という暗号化方式を使ったSSH鍵のペアを作成します。-Cオプションの後ろには、識別用のコメント(通常はメールアドレス)を指定します。
コマンドを実行すると、鍵の保存場所やパスフレーズ(鍵を使う際のパスワード)を聞かれますが、今回はすべてデフォルト設定でEnterキーを3回押して完了しました。
これで、~/.ssh/id_ed25519(秘密鍵)と~/.ssh/id_ed25519.pub(公開鍵)の2つのファイルが作成されました。
2.2. 接続テスト
正しく設定できたか確認するため、接続テストを行いました。

ssh -T git@github.com
Code language: CSS (css)
このコマンドは、GitHubへのSSH接続をテストします。
成功すると、次のようなメッセージが表示されます。
Hi chiilabo! You've successfully authenticated, but GitHub does not provide shell access.
「認証に成功しました」というメッセージです。
後半の「シェルアクセスは提供していません」という部分は、GitHubがSSH接続を認証にのみ使用し、サーバーへの直接ログインは許可していないことを示しています。
これは正常な動作です。
3. 再度のpush
認証が成功したので、改めてgit pushを実行しました。
git push
今度は正常に動作しました。
Enumerating objects: 24, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 4 threads
Compressing objects: 100% (15/15), done.
Writing objects: 100% (15/15), 7.12 KiB | 1.78 MiB/s, done.
Total 15 (delta 9), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (9/9), completed with 8 local objects.
To github.com:chiilabo/####.git
209069a..edc0777 main -> main
Code language: PHP (php)
ファイルが圧縮され、GitHubのサーバーに送信されました。
無事にリモートリポジトリが更新されています。
4. まとめ
「Permission denied (publickey)」エラーは、SSH鍵による認証が設定されていない時に発生します。解決には以下の手順が必要でした。
- SSH鍵のペアを生成する
- 公開鍵をGitHubに登録する
- 接続テストで確認する
初回のホスト認証メッセージは、セキュリティ機能の一部で、異常ではありません。yesと答えれば次回以降は表示されなくなります。
SSH鍵認証は、パスワードよりも安全で、毎回入力する手間もありません。
一度設定すれば、その後のGitHub操作がスムーズになります。
この経験から、GitとGitHubの接続には事前の認証設定が必須だと実感しました。
エラーメッセージを一つずつ読み解いていくことで、問題の本質が見えてきます。