SSH鍵を作成したのにGitHubへ接続できず、Permission denied (publickey)と表示される場合、すぐに鍵を作り直す必要はありません。多くの原因は、接続ユーザーが違う、想定した秘密鍵が使われていない、対応する公開鍵が正しいGitHubアカウントに登録されていないのいずれかです。
最初にssh -vT [email protected]を実行し、「どの接続先に、どの鍵を提示し、GitHubがどのアカウントとして認識したか」を順番に確認します。鍵の作成・選択・登録を段階別に切り分ければ、むやみに再設定せず原因を特定できます。以下はGitHub.comへの接続を前提としています。([GitHub Docs][1])
GitHubのPermission denied (publickey)を鍵の段階別に調べる方法
SSH認証は、次の3段階に分けて考えると分かりやすくなります。
| 段階 | 確認すること | 主な確認方法 |
|---|---|---|
| 接続 | GitHub.comへgitユーザーで接続しているか | ssh -vT [email protected] |
| 鍵の選択 | SSHが想定した秘密鍵を使用しているか | Offering public key、ssh-add -l -E sha256 |
| アカウント照合 | 対応する公開鍵が正しいGitHubアカウントにあるか | GitHubの「SSH and GPG keys」と指紋を比較 |
重要なのは、SSH鍵を作成しただけではGitHub認証は完了しないことです。ローカルに秘密鍵があり、SSHがその鍵を使用し、対応する公開鍵がGitHubアカウントに登録されて初めて認証できます。
まずssh -vT [email protected]で接続状況を確認する
ターミナル、PowerShell、Git Bashなどで次のコマンドを実行します。
ssh -vT [email protected]
-vを付けると、SSHが読み込んだ設定ファイル、接続先、使用を試みた鍵などが表示されます。通常の接続確認だけならssh -T [email protected]でも構いませんが、原因調査では-vを付けた方が効率的です。
接続ユーザーはGitHubのユーザー名ではなくgit
GitHub.comへSSH接続するときのユーザー名は、個人のGitHubユーザー名ではなく、共通のgitです。
正しい形式は次のとおりです。
ssh -T [email protected]
次のようにGitHubのアカウント名を接続ユーザーにすると、認証に失敗します。
ssh -T [email protected]
GitリポジトリのSSH URLも、通常は次の形式です。
[email protected]:OWNER/REPOSITORY.git
現在のリモートURLは次のコマンドで確認できます。
git remote -v
URLが間違っている場合は、次のように変更します。
git remote set-url origin [email protected]:OWNER/REPOSITORY.git
OWNERにはリポジトリ所有者のユーザー名または組織名を指定します。GitHubのユーザー名を使う場所はリポジトリのパス側であり、@github.comの前はgitです。([GitHub Docs][1])
詳細ログで注目する行
ssh -vTの出力は長いため、すべてを読む必要はありません。次の行を順番に探します。
| ログの例 | 意味 |
|---|---|
Connecting to github.com ... port 22 | GitHub.comへ接続しようとしている |
identity file ... type -1 | 指定された場所に鍵ファイルが見つからない |
Offering public key: ... | SSHがその公開鍵をGitHubへ提示した |
Permission denied (publickey) | 提示した鍵が認証に使用されなかった |
Hi USERNAME! You've successfully authenticated... | SSH認証に成功した |
特に注意したいのがOffering public keyです。この表示は、鍵を提示したことを示すだけで、GitHubが受け入れたことを意味しません。
その後にPermission denied (publickey)が出る場合は、次の可能性があります。
- 提示している鍵が想定した鍵ではない
- 対応する公開鍵がGitHubに登録されていない
- 別のGitHubアカウントに登録されている
- SSH設定によって別の鍵が優先されている
最終的な成功判定は、GitHubからアカウント名を含む認証成功メッセージが返るかどうかで行います。
なお、GitHubはSSHの対話型シェルを提供していないため、認証成功メッセージが表示されてもssh -Tの終了コードが1になることがあります。終了コードだけで失敗と判断せず、表示されたメッセージを確認してください。初回接続でホスト鍵の確認が表示された場合は、GitHubが公開しているホスト鍵の指紋と一致することを確認してから承認します。([GitHub Docs][2])
ssh-agentに登録されている鍵を確認する
秘密鍵を作成していても、SSHエージェントに読み込まれていなければ、自動的に使用されないことがあります。
次のコマンドで、現在SSHエージェントが保持している鍵を確認します。
ssh-add -l -E sha256
表示される主な情報は次のとおりです。
256 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ~/.ssh/id_ed25519 (ED25519)
確認するポイントは、ファイル名とSHA256:から始まる指紋です。
鍵が1件も表示されない場合
The agent has no identities.などと表示される場合は、秘密鍵をSSHエージェントへ追加します。
ssh-add ~/.ssh/id_ed25519
独自のファイル名で作成した場合は、その秘密鍵を指定します。
ssh-add ~/.ssh/id_ed25519_github
ここで指定するのは、通常、.pubが付いていない秘密鍵ファイルです。
SSHエージェント自体に接続できないエラーが出る場合は、OS側でエージェントが起動していない可能性があります。その場合でも、次の-iオプションを使えば、エージェントを経由せず使用する鍵を明示して切り分けられます。GitHub公式ドキュメントでも、ssh-add -l -E sha256による鍵と指紋の確認が案内されています。([GitHub Docs][1])
ssh -iで使用する秘密鍵を明示する
鍵を複数作成している場合や、標準とは異なるファイル名で保存した場合は、SSHが別の鍵を選んでいる可能性があります。
使用する秘密鍵を明示してテストします。
ssh -i ~/.ssh/id_ed25519_github -vT [email protected]
さらに、SSHエージェント内の別の鍵を試させず、指定した鍵だけで確認したい場合は、IdentitiesOnly=yesを付けます。
ssh -i ~/.ssh/id_ed25519_github -o IdentitiesOnly=yes -vT [email protected]
-iには、切り分け対象の秘密鍵ファイルを指定してください。公開鍵のid_ed25519_github.pubではなく、.pubが付いていない方です。
-iを付けた場合だけ認証に成功するなら、鍵そのものやGitHub側の登録ではなく、通常接続時の鍵選択に問題があります。-iは認証に使う鍵を指定するオプションで、IdentitiesOnly yesを併用すると、設定またはコマンドで指定した鍵に絞って認証できます。([OpenBSD Manual Pages][3])
使用する鍵をSSH設定ファイルに固定する
毎回-iを付けずに済ませるには、~/.ssh/configへGitHub用の設定を記述します。
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
設定後、もう一度接続を確認します。
ssh -vT [email protected]
この設定により、github.comへ接続するときは指定した秘密鍵が優先されます。
個人用と仕事用のGitHubアカウントを使い分ける場合
複数のGitHubアカウントを利用している場合は、同じgithub.comに対して別名を付けます。
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
個人用アカウントをテストする場合は、次のように実行します。
ssh -T git@github-personal
個人用リポジトリのリモートURLも、設定した別名に合わせます。
git remote set-url origin git@github-personal:OWNER/REPOSITORY.git
github-personalはローカルのSSH設定上の別名です。実際の接続先はHostName github.comで指定したGitHub.comになります。
公開鍵が正しいGitHubアカウントへ登録されているか確認する
ローカルで使用している秘密鍵が分かったら、対応する公開鍵をGitHub側と照合します。
公開鍵の指紋は次のコマンドで確認できます。
ssh-keygen -lf ~/.ssh/id_ed25519_github.pub -E sha256
例として、次のような指紋が表示されます。
256 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx comment (ED25519)
ssh-keygenの-lは公開鍵の指紋を表示し、-E sha256は表示に使用するハッシュ方式をSHA-256に指定します。([OpenBSD Manual Pages][4])
続いて、GitHubで次の場所を開きます。
- GitHubへサインインする
- プロフィールメニューから
Settingsを開く SSH and GPG keysを開く- 登録済みの認証用SSH鍵を確認する
- ローカルで確認した指紋と照合する
該当する公開鍵がない場合は、New SSH keyまたはAdd SSH keyから登録します。鍵の種類を選択できる場合は、Git操作の認証に使う鍵として登録します。
公開鍵の内容は次のように確認できます。
cat ~/.ssh/id_ed25519_github.pub
通常、公開鍵は次のような1行の文字列です。
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... comment
この1行全体をGitHubのKey欄へ貼り付けます。余分な改行や空白を追加しないようにします。GitHubでSSH認証を利用するには、鍵ペアを作成するだけでなく、公開鍵を対象アカウントへ追加する必要があります。([GitHub Docs][5])
秘密鍵はGitHubへ登録しない
GitHubへ登録するのは、ファイル名の末尾が.pubの公開鍵です。
| ファイル例 | 種類 | 取り扱い |
|---|---|---|
id_ed25519 | 秘密鍵 | 外部へ送信・貼り付け・公開しない |
id_ed25519.pub | 公開鍵 | GitHubのSSHキー設定へ登録する |
秘密鍵の内容には、次のようなヘッダーが含まれることがあります。
-----BEGIN OPENSSH PRIVATE KEY-----
この内容をGitHubの設定画面、問い合わせフォーム、チャット、スクリーンショットなどへ載せてはいけません。誤って秘密鍵を公開した場合は、その鍵を使い続けず、GitHubから登録を削除したうえで新しい鍵ペアへ交換します。
認証されたGitHubアカウント名を確認する
SSH認証に成功すると、GitHubは認証されたユーザー名を表示します。
Hi USERNAME! You've successfully authenticated...
ここに表示されたUSERNAMEが、利用したいGitHubアカウントと一致しているか確認してください。
認証には成功しているものの別のユーザー名が表示される場合、使用した公開鍵は別アカウントに関連付けられています。この状態では、目的のアカウントだけがアクセスできるプライベートリポジトリを操作できません。
その場合は、次のいずれかで整理します。
- 目的のアカウント用の鍵を
-iで指定する ~/.ssh/configでアカウント別の接続先名を作る- リポジトリのリモートURLを正しい接続先名へ変更する
sudoや管理者権限でGitを実行しない
通常ユーザーでSSH鍵を作成した後、次のようにsudoを付けてGitを実行すると、別のユーザー環境が使用されることがあります。
sudo git push
sudoで実行したプロセスは、通常ユーザーとは異なるホームディレクトリ、SSH設定、秘密鍵、SSHエージェントを参照する可能性があります。そのため、通常ユーザーでは認証できるのに、sudo git pushではPermission denied (publickey)になることがあります。
次のコマンドで、現在の実行ユーザーとホームディレクトリを確認できます。
whoami
echo $HOME
GitHub公式ドキュメントでも、Git操作にsudoや昇格した権限を使用しないことが案内されています。通常ユーザーで操作できない場合は、SSH鍵を管理者側へコピーするのではなく、リポジトリや作業フォルダーの所有権・権限を見直す方が安全です。([GitHub Docs][1])
SSH接続は成功するのにgit pushだけ失敗する場合
ssh -T [email protected]には成功するのに、git pushやgit pullだけ失敗する場合は、SSH鍵以外の設定を確認します。
リモートURLがHTTPSになっていないか確認する
git remote -v
次のようにhttps://で始まる場合、そのリポジトリはSSHではなくHTTPSを使用しています。
https://github.com/OWNER/REPOSITORY.git
SSHへ変更する場合は、次のように設定します。
git remote set-url origin [email protected]:OWNER/REPOSITORY.git
HTTPS接続のまま使う場合、SSH鍵の設定はそのGit操作には影響しません。
Gitだけ別のSSHコマンドを使っていないか確認する
Gitには、通常のsshとは別のコマンドを使用するcore.sshCommand設定があります。
git config --show-origin --get core.sshCommand
何も表示されなければ、通常は標準のSSHコマンドが使われます。値が表示された場合は、その設定で別の鍵や別のSSHクライアントが指定されていないか確認します。
Gitはcore.sshCommandやGIT_SSH_COMMANDが設定されていると、fetchやpushで標準のsshとは異なるコマンドを使用します。そのため、ターミナルのSSHテストとGit操作で結果が異なることがあります。([Git][6])
認証成功とリポジトリ権限は別に確認する
SSH認証が成功しても、そのGitHubアカウントが対象リポジトリへのアクセス権を持っているとは限りません。
認証後にリポジトリ操作だけ失敗する場合は、次を確認します。
- 表示されたGitHubユーザー名が正しいか
- プライベートリポジトリへのアクセス権があるか
- 組織やチームへ正しく参加しているか
- リポジトリ名や所有者名が正しいか
- 組織のSSO認可が必要ではないか
組織でSSOを使用している場合はSSH鍵を認可する
企業や組織のGitHubでシングルサインオンを使用している場合、GitHubアカウントへSSH鍵を登録するだけでなく、その組織で鍵を使用するための認可が必要なことがあります。
この場合は、GitHubのSettingsからSSH and GPG keysを開き、対象鍵のConfigure SSOから組織への認可状態を確認します。
ただし、SSOの問題を疑うのは、通常のssh -T [email protected]で正しいアカウントへの認証が成功し、特定の組織リポジトリだけ操作できない場合です。GitHub.com全体へのテストでPermission denied (publickey)になる場合は、先にローカルの鍵選択と公開鍵登録を確認します。([GitHub Docs][7])
よくある誤判定と正しい確認方法
| 誤判定 | 正しい考え方 |
|---|---|
| SSH鍵を作成したので認証できるはず | 公開鍵のGitHub登録と秘密鍵の選択も必要 |
Offering public keyが出たので成功 | 鍵を提示しただけ。最終的な認証成功メッセージを確認する |
| GitHubユーザー名でSSH接続する | GitHub.comでは[email protected]を使う |
.pubファイルを秘密鍵として指定する | -iでは対応する秘密鍵ファイルを指定する |
| 鍵ファイルがあるので自動的に使われる | 独自名の鍵はエージェントやSSH設定に追加されていない場合がある |
sudoを付ければ権限エラーを解消できる | 別ユーザーのSSH環境になり、認証できなくなる可能性がある |
| SSHテストが成功すればすべてのリポジトリへアクセスできる | リポジトリの権限、組織参加、SSO認可は別に必要 |
ssh -Tの終了コードが1なので失敗 | GitHubでは成功時にも終了コード1になる場合がある |
git pushもSSH鍵を使っているはず | リモートURLがHTTPSならSSH鍵は使われない |
最短で解決するための確認順序
次の順番で調べると、原因を絞り込みやすくなります。
sudoを使っていない通常のターミナルを開くgit remote -vで接続方式とURLを確認するssh -vT [email protected]で接続ログを表示する- 接続ユーザーが
gitになっているか確認する Offering public keyに表示された鍵を確認するssh-add -l -E sha256でエージェント内の鍵を確認するssh -i 秘密鍵 -o IdentitiesOnly=yes -vT [email protected]で鍵を固定して試す- 公開鍵の指紋とGitHubの登録鍵を照合する
- 認証成功時に表示されるGitHubユーザー名を確認する
- 必要に応じて
~/.ssh/configへ使用する鍵を固定する
SSH鍵を何度も作り直すと、どの公開鍵と秘密鍵が対応しているのか分かりにくくなります。まずはssh -vT [email protected]と鍵の指紋を使い、接続先、使用鍵、登録アカウントの3点を順番に照合してください。
[1]: https://docs.github.com/en/authentication/troubleshooting-ssh/error-permission-denied-publickey “Error: Permission denied (publickey) – GitHub Docs”
[2]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection “Testing your SSH connection – GitHub Docs”
[3]: https://man.openbsd.org/ssh.1 “ssh(1) – OpenBSD manual pages”
[4]: https://man.openbsd.org/ssh-keygen.1 “ssh-keygen(1) – OpenBSD manual pages”
[5]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account “Adding a new SSH key to your GitHub account – GitHub Docs”
[6]: https://git-scm.com/docs/git-config “Git – git-config Documentation”
[7]: https://docs.github.com/en/authentication/authenticating-with-single-sign-on/authorizing-an-ssh-key-for-use-with-single-sign-on “Authorizing an SSH key for use with single sign-on – GitHub Enterprise Cloud Docs”

コメント