InfraAcademy

InfraAcademy Blog

【Git】鍵再生成してもできなかった・・・”Permission denied”のエラーの対処方法解説

| #git
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、GitでPermission denied (publickey).というエラーが発生した際の対処方法を解説します。

私も以前、SSHキーを作り直してGitHubへ登録したのに、なぜかgit pushができないことがありました。そのときの原因は、秘密鍵がssh-agentに読み込まれていなかったことでした。

ただし、このエラーは秘密鍵の読み込みだけが原因ではありません。SSHの接続先やGitHubへ登録した公開鍵なども順番に確認します。

【Git】Permission deniedのエラーの対処方法解説

今回のエラーでは、Gitで下記のエラーが発生した場合の対処方法を解説します。

git@github.com: Permission denied (publickey).

このエラーは、GitHubへSSH接続しようとしたものの、公開鍵認証に成功しなかった場合に表示されます。

鍵を作り直せば必ず直るわけではありません。まず現在のSSH設定を確認して、どこで認証に失敗しているのかを切り分けていきましょう。

Permission denied (publickey)が出る主な原因

GitHubへSSHで接続するときは、ローカルPCに秘密鍵を置き、対応する公開鍵をGitHubへ登録します。

仕組みについて詳しく知りたい方は、【関連記事】公開鍵暗号方式をわかりやすく解説も参考にしてください。

今回のエラーで確認したいポイントをまとめると、次のようになります。

確認すること よくある状態
SSH接続先 git@github.comではないユーザー名を使っている
SSHキー ~/.sshに鍵が存在しない
ssh-agent 秘密鍵が読み込まれていない
GitHub側 公開鍵をGitHubへ登録していない
リモートURL HTTPSとSSHを勘違いしている
複数の鍵 意図していない秘密鍵が選択されている

まずは一つずつ確認していきましょう。

ssh -TでGitHubへ接続できるか確認する

GitHubへのSSH接続をテストする

最初に、Git Bashやターミナルを開いて次のコマンドを実行します。

ssh -T git@github.com

SSHの設定が正常であれば、GitHubのユーザー名を含む認証成功のメッセージが表示されます。

一方、設定に問題がある場合は次のように表示されます。

git@github.com: Permission denied (publickey).

git pushでエラーが出ている場合も、まずssh -Tで同じエラーになるか確認しましょう。

SSHコマンド自体に慣れていない方は、【関連記事】sshコマンドの使い方を解説!リモートのサーバーを操作しようもご覧ください。

ssh-agentに秘密鍵が読み込まれているか確認する

Permission deniedは秘密鍵がロードされていなかったから

まず、エラーの確認です。Git Bashやターミナルを開いてください。

git pushssh -T git@github.comでGitHubにアクセスしようとすると、下記の画面のようにエラーが発生しました。

Permission denied これの原因は、秘密鍵がロードされていないことでした。下記のコマンドで確認できます。

ssh-add -l -E sha256

次のように表示されることがあります。

The agent has no identities.

“The agent has no identities.”というメッセージが表示されました。これは、ssh-agentに現在利用できる鍵が読み込まれていない状態を表しています。

秘密鍵のファイルそのものが存在しない、という意味ではない点に注意してください。

ssh-agentを起動する

ssh-addを実行してもssh-agentへ接続できない場合は、まずssh-agentを起動します。

Linux、macOS、Git Bashなどでは、次のように起動できます。

eval "$(ssh-agent -s)"

次に、秘密鍵を追加します。

下記のコマンドで秘密鍵を追加しましょう。

ssh-add ~/.ssh/id_ed25519

別のファイル名を使っている場合は、その秘密鍵を指定します。

ssh-add ~/.ssh/[秘密鍵のファイル名]

ここで指定するのは.pubが付いていない方です。

id_ed25519が秘密鍵、id_ed25519.pubが公開鍵です。秘密鍵は第三者へ共有しないようにしてください。

追加できたら、もう一度確認します。

ssh-add -l -E sha256

鍵のフィンガープリントが表示されれば、ssh-agentへ読み込まれています。

その後、もう一度GitHubへ接続します。

ssh -T git@github.com

これで、Githubへの接続ができるようになりました。

ssh-addで直らない場合に確認すること

秘密鍵を読み込んでも直らない場合は、別の原因を確認します。

~/.sshにSSHキーがあるか確認する

まず、SSHキーが存在しているか確認しましょう。

ls -al ~/.ssh

たとえば、Ed25519形式の鍵であれば次のようなファイルがあります。

id_ed25519
id_ed25519.pub

秘密鍵と公開鍵がない場合は、新しくSSHキーを作成します。

ssh-keygen -t ed25519 -C "your_email@example.com"

画面の案内に沿って保存場所やパスフレーズを設定してください。

すでに利用中の鍵がある場合は、何も確認せず上書きしないようにしましょう。

公開鍵がGitHubに登録されているか確認する

公開鍵がGitHubへ登録されているかも確認します。内容は次のように表示できます。

cat ~/.ssh/id_ed25519.pub

表示された公開鍵をGitHubのSettingsからSSH and GPG keysへ登録します。

登録するのは.pubが付いた公開鍵です。秘密鍵の内容は登録しません。

GitHubにはgitユーザーで接続する

GitHubへSSH接続するときは、自分のGitHubユーザー名をSSHのユーザー名として指定するのではなく、gitを使います。

正しい例は次の通りです。

ssh -T git@github.com

たとえば、自分のGitHubユーザー名がryuであっても、次のようにはしません。

ssh -T ryu@github.com

GitHubへSSH接続するときのユーザー名はgitと覚えておきましょう。

GitのリモートURLも確認する

git pushだけ失敗する場合は、リモートURLも確認します。

git remote -v

SSH接続を利用している場合は、次のような形式になっています。

git@github.com:example/sample.git

HTTPSの場合は次のような形式です。

https://github.com/example/sample.git

SSH形式へ変更したい場合は、URLを確認して次のように変更できます。

git remote set-url origin git@github.com:example/sample.git

Gitそのもののインストールや基本操作から確認したい方は、【関連記事】gitコマンドのインストール方法を解説!Linuxでgitを使おうも参考にしてください。

複数のSSHキーがある場合は-vで確認する

仕事用と個人用など、複数のSSHキーを使っていると、GitHubへ送信している鍵が想定と違うことがあります。

その場合は、-vを付けてSSHの詳細なログを確認できます。

ssh -vT git@github.com

出力の中から、どの秘密鍵を試しているのか確認します。

必要に応じて~/.ssh/configで利用する鍵を指定する方法もあります。

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519

設定を変更したら、再び次のコマンドで確認しましょう。

ssh -T git@github.com

参考:その他の原因の場合

これ以外でもエラーが出続ける場合は、GitHub公式ドキュメントも確認してください。

Error: Permission denied (publickey) – GitHub Docs

GitHub公式でも、接続先、gitユーザー、SSHキー、公開鍵の登録などを順番に確認できます。

LinuxやSSHを実際に操作しながら学習する

GitのSSH認証では、ssh、ファイルパス、公開鍵・秘密鍵、権限などLinuxの知識が登場します。

InfraAcademyでは、Linuxの基本操作からネットワーク、AWSまで、ブラウザ上で実際に操作しながら学習できます。

Linuxのコマンドやファイル操作から学びたい方は、Linux入門講座をご覧ください。

SSHを理解するうえでも重要なIPアドレスや通信の仕組みは、ネットワーク講座で学習できます。

さらに、クラウド上のLinuxサーバーを扱いたい方は、AWS講座もおすすめです。

【Git】Permission deniedのエラーまとめ

今回の記事では、GitでPermission denied (publickey)が発生した場合の対処方法について解説しました。

私の場合は、SSHキー自体は作成できていましたが、秘密鍵がssh-agentへ読み込まれていないことが原因でした。

まずは次のコマンドで、GitHubへの接続を確認してみましょう。

ssh -T git@github.com

エラーになる場合は、ssh-agentへ読み込まれている鍵を確認します。

ssh-add -l -E sha256

鍵が読み込まれていなければ、ssh-agentを起動して秘密鍵を追加します。

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

それでも直らない場合は、公開鍵の登録、gitユーザー、リモートURL、利用している秘密鍵を順番に確認してください。

鍵を何度も作り直す前に、一つずつ原因を切り分けていきましょう。

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る