GitHubへのpushで
「Permission denied (publickey)」
エラー
(SSH接続と公開鍵の登録)

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

<svg class="eyecatch-svg" viewBox="0 0 192 192" xmlns="http://www.w3.org/2000/svg">
  <!-- 背景 -->
  <rect width="192" height="192" rx="32" ry="32" fill="white"/>
  
  <!-- 鍵本体のグループ -->
  <g transform="translate(48, 60)">
    <!-- 鍵の円形部分 -->
    <circle cx="24" cy="24" r="20" fill="none" stroke="#2196F3" stroke-width="4" stroke-linecap="round"/>
    <circle cx="24" cy="24" r="8" fill="none" stroke="#2196F3" stroke-width="4"/>
    
    <!-- 鍵の軸部分 -->
    <rect x="38" y="20" width="48" height="8" rx="2" fill="#2196F3"/>
    
    <!-- 鍵のギザギザ部分 -->
    <rect x="70" y="12" width="8" height="8" rx="2" fill="#2196F3"/>
    <rect x="78" y="12" width="8" height="16" rx="2" fill="#2196F3"/>
  </g>
  
  <!-- チェックマークの背景円 -->
  <circle cx="132" cy="132" r="28" fill="#4CAF50"/>
  
  <!-- チェックマーク -->
  <g transform="translate(132, 132)">
    <path d="M -10 0 L -4 8 L 12 -10" 
          fill="none" 
          stroke="white" 
          stroke-width="4" 
          stroke-linecap="round" 
          stroke-linejoin="round"/>
  </g>
  
  <!-- ターミナル的な装飾要素(小さく) -->
  <g transform="translate(48, 120)">
    <rect width="56" height="40" rx="4" fill="none" stroke="#607D8B" stroke-width="2"/>
    <line x1="8" y1="12" x2="16" y2="12" stroke="#607D8B" stroke-width="2" stroke-linecap="round"/>
    <line x1="8" y1="20" x2="20" y2="20" stroke="#607D8B" stroke-width="2" stroke-linecap="round"/>
    <line x1="8" y1="28" x2="14" y2="28" stroke="#607D8B" stroke-width="2" stroke-linecap="round"/>
  </g>
</svg>GitHubへのpushで<br class="chiilabo-br is-on">「Permission denied (publickey)」<br class="chiilabo-br is-on">エラー<br class="chiilabo-br is-on">(SSH接続と公開鍵の登録)
解決手順まとめ 1 SSH鍵ペアを生成 2 公開鍵をGitHubに登録 3 接続テストで確認 重要ポイント 初回のみ設定が必要 秘密鍵は外部に出さない パスワード不要で便利 一度設定すれば完了

関連記事

1. 「Permission denied (publickey)」エラー

git pushコマンドを実行すると、次のようなメッセージが表示されました。

? 最初のエラー:ホスト認証 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鍵認証について説明します。

SSH鍵認証の仕組み 秘密鍵 ローカルに保存 外部に出さない 数学的に対応 公開鍵 GitHubに登録 公開してOK 秘密鍵で署名 → 公開鍵で検証

GitHubとの通信には、SSH(Secure Shell)という暗号化された通信方法を使います。
この時、パスワードではなく「鍵」を使って認証を行います。

鍵は2つセットで使います。
1つは「秘密鍵」で、自分のコンピューターだけに保存します。
もう1つは「公開鍵」で、GitHubのサーバーに登録します。
この2つの鍵は数学的に対応しており、秘密鍵を持っている人だけが、公開鍵に対応する本人だと証明できる仕組みです。

今回のエラーは、GitHubに公開鍵が登録されていないか、ローカルに秘密鍵がないことを示しています。

2. SSH鍵を用意してGitHubに登録する

公開鍵の確認と登録 1 公開鍵を表示 cat ~/.ssh/ id_ed25519.pub 2 内容をコピー 3 GitHubに登録 Settings → SSH and GPG keys → New SSH key → 公開鍵を貼り付け

まず、自分のコンピューターにSSH鍵があるか確認しました。

公開鍵の内容を表示するには、

2. SSH鍵を用意してGitHubに登録する
cat ~/.ssh/id_ed25519.pub
Code language: JavaScript (javascript)

すると、ssh-ed25519で始まる長い文字列が表示されるはずです。
この文字列全体が公開鍵です。
この内容をコピーして、GitHubに登録します。

2. SSH鍵を用意してGitHubに登録する

GitHubのウェブサイトで以下の手順を実行しました。

  1. GitHubにログイン後、Settings(設定)ページを開く
  2. 左側のメニューから「SSH and GPG keys」を選択
  3. 「New SSH key」ボタンをクリック
  4. Titleには識別しやすい名前を入力(例:「作業用マシン」)
  5. Key欄に、先ほどコピーした公開鍵の内容を貼り付け
  6. 「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. 接続テスト

正しく設定できたか確認するため、接続テストを行いました。

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鍵による認証が設定されていない時に発生します。解決には以下の手順が必要でした。

  1. SSH鍵のペアを生成する
  2. 公開鍵をGitHubに登録する
  3. 接続テストで確認する

初回のホスト認証メッセージは、セキュリティ機能の一部で、異常ではありません。yesと答えれば次回以降は表示されなくなります。

SSH鍵認証は、パスワードよりも安全で、毎回入力する手間もありません。
一度設定すれば、その後のGitHub操作がスムーズになります。

この経験から、GitとGitHubの接続には事前の認証設定が必須だと実感しました。
エラーメッセージを一つずつ読み解いていくことで、問題の本質が見えてきます。