- ネットワーク
- 技術 💻
SSH鍵の作成とGitHub接続|Permission deniedの対処法
GitHubにSSHで接続するには、ssh-keygen -t ed25519 で鍵を作成し、公開鍵(.pubファイル)をGitHubに登録して、ssh -T git@github.com で接続を確認します。「Permission denied (publickey)」が出る場合は、SSHがどの鍵を使おうとしているかを ssh -vT git@github.com のログで確認すると、ほとんどの原因を特定できます。
この記事では、Mac・Windows・Linuxでの鍵の作成から、パスフレーズとssh-agent、~/.ssh/config の書き方、複数アカウントの使い分け、そしてPermission deniedの原因の切り分けまでを、順を追って解説します。
SSH鍵の仕組み:公開鍵と秘密鍵
SSH鍵は、2つのファイルのペアです。
| ファイル | 例 | 扱い |
|---|---|---|
| 秘密鍵 | ~/.ssh/id_ed25519 | 自分のパソコンだけに置く。誰にも渡さない |
| 公開鍵 | ~/.ssh/id_ed25519.pub | GitHubなど、接続先に登録する。公開してよい |
接続するとき、GitHubは登録された公開鍵を使って「この秘密鍵を持っている人か」を確認します。秘密鍵そのものはネットワークに送られません。GitHubに登録するのは、必ず「.pub」の付いた公開鍵です。
SSH鍵の作成から接続確認まで
1. 既存の鍵を確認する
ls -al ~/.ssh
id_ed25519 と id_ed25519.pub(または id_rsa と id_rsa.pub)があれば、すでに鍵があります。新しく作る場合は、既存の鍵を上書きしないようファイル名に注意してください。
2. 鍵を作成する
ssh-keygen -t ed25519 -C "you@example.com"
-t ed25519— 鍵の種類。現在の推奨で、短く安全-C— 鍵を見分けるためのコメント(メールアドレスなど)
実行すると、保存場所とパスフレーズを聞かれます。
Enter file in which to save the key (/Users/you/.ssh/id_ed25519): ← Enterでよい
Enter passphrase (empty for no passphrase): ← パスフレーズを入力
パスフレーズは設定するのがおすすめです。秘密鍵のファイルが漏れても、パスフレーズがなければ使えません。毎回の入力は、後述のssh-agentで省略できます。
Windowsでは、PowerShellまたはGit Bashで同じコマンドを実行できます(Windows 10以降はOpenSSHが標準で入っています)。
3. ssh-agentに鍵を登録する
ssh-agentは、パスフレーズを入力した鍵をメモリに保持し、接続のたびにパスフレーズを聞かれないようにする仕組みです。
Mac
eval "$(ssh-agent -s)"
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
~/.ssh/config に次の設定を追加すると、再起動後もキーチェーンからパスフレーズが読み込まれます。
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
Windows(PowerShellを管理者として実行)
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
4. 公開鍵をGitHubに登録する
公開鍵の中身をコピーします。
pbcopy < ~/.ssh/id_ed25519.pub # Mac
Get-Content ~/.ssh/id_ed25519.pub | Set-Clipboard # Windows(PowerShell)
cat ~/.ssh/id_ed25519.pub # Linux(表示された1行をコピー)
GitHubの「Settings」→「SSH and GPG keys」→「New SSH key」で、Titleに分かりやすい名前(例:会社のノートPC)を付け、Key typeは「Authentication Key」のまま、コピーした内容を貼り付けて登録します。
コピーしたのは ssh-ed25519 AAAA... you@example.com のような1行のはずです。途中で改行が入ったり、秘密鍵(-----BEGIN OPENSSH PRIVATE KEY----- で始まるもの)を貼ったりしていないか確認してください。
5. 接続を確認する
ssh -T git@github.com
初めて接続するときは、GitHubのサーバーを信頼するか聞かれます。
The authenticity of host 'github.com' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
表示されたフィンガープリントが、GitHubの公式ドキュメントに掲載されている値と一致することを確認してから yes と入力します。次のように表示されれば成功です。
Hi your-name! You've successfully authenticated, but GitHub does not provide shell access.
6. リポジトリのURLをSSHにする
git remote -v # 現在のURLを確認
git remote set-url origin git@github.com:your-name/repo.git # SSHのURLに変更
https://github.com/... のURLのままだと、SSH鍵は使われません。SSH鍵を使うのは git@github.com:... の形式のURLです。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「SSH鍵の作成とGitHub接続|Permission deniedの対処法」
Permission denied (publickey) の原因と切り分け
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
このエラーは、GitHubが「受け入れられる鍵が提示されなかった」と判断したことを意味します。原因は、ほぼ次のどれかです。
まず ssh -vT でログを見る
ssh -vT git@github.com
大量のログが出ますが、見るべき行は限られています。
| ログの行 | 意味 |
|---|---|
identity file /Users/you/.ssh/id_ed25519 type -1 |
その場所に鍵ファイルがない(type -1) |
identity file /Users/you/.ssh/id_ed25519 type 3 |
鍵ファイルが見つかった |
Offering public key: /Users/you/.ssh/id_ed25519 ED25519 SHA256:xxxx |
この鍵をGitHubに提示した |
Server accepts key: ... |
GitHubが鍵を受け入れた |
Authentications that can continue: publickey のあと No more authentication methods to try. |
提示した鍵がすべて拒否された、または提示できる鍵がなかった |
原因別の対処
| ログの状況 | 考えられる原因 | 対処 |
|---|---|---|
| 鍵がどれも見つからない(type -1だけ) | 鍵がない、または標準と違う名前で保存した | 鍵の場所を確認し、~/.ssh/config の IdentityFile で指定する |
| 鍵を提示したが拒否された | GitHubに登録した公開鍵と、手元の秘密鍵のペアが違う | 下記の方法でフィンガープリントを比較する |
| 鍵を提示したが拒否された | 別のGitHubアカウントに登録した鍵を使っている | 下記の「複数アカウント」の設定をする |
| Offeringの行がない | ssh-agentに鍵が登録されていない、パスフレーズ付きの鍵を読めていない | ssh-add -l で確認し、ssh-add で登録する |
| 鍵ファイルの権限の警告が出ている | 秘密鍵が他のユーザーから読める | chmod 600 ~/.ssh/id_ed25519、chmod 700 ~/.ssh |
sudo git push のときだけ失敗する |
rootユーザーの鍵(/root/.ssh)が使われている | sudoを付けずに実行する |
手元の鍵と、GitHubに登録した鍵が同じか確認する
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 256 SHA256:AbCdEf... you@example.com (ED25519)
表示された SHA256:... を、GitHubの「SSH and GPG keys」の画面に表示されている値と比較します。一致しなければ、登録した鍵と使っている鍵が違います。公開鍵を登録し直してください。
ssh-agentの状態を確認する
ssh-add -l
The agent has no identities. と表示されたら、ssh-agentに鍵が登録されていません。ssh-add ~/.ssh/id_ed25519 で登録します。
~/.ssh/config で接続を整理する
~/.ssh/config に設定を書いておくと、どの接続先にどの鍵を使うかを明示できます。
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
IdentitiesOnly yes は、指定した鍵だけを使う設定です。鍵が多いと、SSHが関係ない鍵を順に試して、GitHubの試行回数の上限に達し、拒否される場合があります。
複数のGitHubアカウントを使い分ける
仕事用と個人用など、複数のアカウントを使う場合は、同じ鍵を2つのアカウントに登録することはできません(「Key is already in use」というエラーになります)。アカウントごとに鍵を作り、ホスト名の別名で使い分けます。
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work
# 個人用
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
# 仕事用
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
仕事用のリポジトリは、URLのホスト名を別名に変えて使います。
git clone git@github-work:company/repo.git
ssh -T git@github-work # 仕事用アカウントで認証されるか確認
リポジトリごとに、コミットに記録される名前とメールアドレスも設定しておきます。
git config user.name "Your Name"
git config user.email "work@example.com"
その他のエラーと対処
ポート22がふさがれている(Connection timed out)
会社やカフェのネットワークで、SSHのポート22が使えない場合は、GitHubが用意しているポート443での接続を使います。
ssh -T -p 443 git@ssh.github.com # 443でつながるか確認
Host github.com
HostName ssh.github.com
Port 443
User git
Host key verification failed / REMOTE HOST IDENTIFICATION HAS CHANGED
手元に記録されているGitHubのサーバーの鍵(known_hosts)と、実際のサーバーの鍵が一致しないときのエラーです。GitHubは2023年3月に、RSAのホスト鍵を変更しており、それ以前の記録が残っている環境でこのエラーが出ます。
ssh-keygen -R github.com # 古い記録を削除
ssh -T git@github.com # 再接続し、フィンガープリントを公式の値と照合してから yes
公式に発表されている変更以外でこのエラーが出た場合は、通信が第三者に中継されている可能性もあります。フィンガープリントを必ず公式ドキュメントで確認してください。
Windowsで、登録した鍵が使われない
Git for Windowsに付属するSSHと、Windows標準のOpenSSHは別のプログラムで、ssh-agentも別々です。PowerShellでssh-agentに鍵を登録したのに git push で使われない場合は、GitがWindows標準のSSHを使うように設定します。
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
WSLで使う場合
WSL(Linux)とWindowsは、ホームディレクトリが別です。WSLの中でgitを使うなら、WSLの ~/.ssh に鍵を作成(または配置)し、権限を600に設定します。Windows側のフォルダー(/mnt/c/...)に置いた鍵は、権限を正しく設定できず、使えないことがあります。
RSAの鍵は使えなくなったのか
RSAの鍵も引き続き使えますが、古い署名方式(SHA-1)での接続は受け付けられなくなっています。古いOpenSSHや古い鍵で接続できなくなった場合は、ed25519の鍵を新しく作成するのが最も確実です。
ハードウェアのセキュリティキーを使う場合は、ssh-keygen -t ed25519-sk で、鍵を物理的なキーに結び付けることもできます。
よくある質問
Q. HTTPSとSSHのどちらで接続すべきですか? A. どちらでも構いません。HTTPSの場合は、パスワードではなく個人アクセストークン(または認証ヘルパー)が必要です。一度設定すれば毎回の入力が不要になる点、組織のセキュリティ方針で鍵の管理がしやすい点から、SSHを選ぶ人も多くいます。
Q. 秘密鍵を別のパソコンにコピーしてもいいですか? A. できますが、パソコンごとに鍵を作成して、それぞれGitHubに登録する方が安全です。パソコンを紛失したときに、そのパソコンの鍵だけを削除すれば済みます。
Q. デプロイキーとは何ですか? A. 特定の1つのリポジトリだけにアクセスできるSSH鍵です。サーバーから特定のリポジトリを取得する用途などで使います。アカウントの鍵と同じ鍵は登録できません。
Q. パスフレーズを忘れました。 A. パスフレーズは復元できません。新しい鍵を作成してGitHubに登録し、古い鍵はGitHubから削除してください。
まとめ
- 鍵は
ssh-keygen -t ed25519で作成し、パスフレーズを設定してssh-agentに登録する - GitHubに登録するのは .pubの公開鍵。秘密鍵は渡さない
- 接続確認は
ssh -T git@github.com。リポジトリのURLがgit@github.com:形式か確認する - Permission deniedは
ssh -vTのログで、どの鍵を提示したかを見る。フィンガープリントで登録した鍵と照合する - 複数アカウントは、アカウントごとに鍵を作り、configのHost別名で使い分ける
- ポート22が使えなければ ssh.github.com の443番、known_hostsのエラーは公式のフィンガープリントを確認してから更新する
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「SSH鍵の作成とGitHub接続|Permission deniedの対処法」
株式会社RJCでは、開発環境の設定のような「最初の一歩」も、仕組みから理解できるよう仲間と教え合っています。こうした知識を共有しながら、一緒に成長を楽しんでいます。
株式会社RJC ― SI事業・SES事業・AI駆動開発。未経験からエンジニアに育てるのが得意な会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。