GitHubにコードをpush/pullするたびにユーザー名とパスワード(あるいはPersonal Access Token)を求められて煩わしい、あるいは「Permission denied (publickey)」で接続できずに困っている——そんな悩みを解決するのがSSH接続だ。本記事は、ed25519鍵の作成から~/.ssh/configの設定、接続確認、複数アカウントの使い分け、そして代表的なエラーの切り分け方までを一本にまとめた決定版である。GitHub公式ドキュメントの現行手順に基づいているので、初めてSSH接続を設定する人も、過去にRSA鍵で設定して行き詰まった人も、順番に進めれば迷わない。
1. なぜHTTPSではなくSSHか
GitHubへの接続方式には大きく分けてHTTPSとSSHの2種類がある。まず両者の違いを把握してから作業に入ろう。
| 項目 | HTTPS | SSH |
|---|---|---|
| 認証方法 | Personal Access Token(またはGit Credential Manager経由の認証) | 公開鍵認証(鍵ペア) |
| 毎回の入力 | トークンの入力・キャッシュ管理が必要になりがち | 一度設定すれば以後は無入力(ssh-agentが鍵を保持) |
| ポート | 443(プロキシ・ファイアウォールを通りやすい) | 22(環境によってはブロックされる) |
| 向いている場面 | 制限の多い社内ネットワーク、CI環境での一時利用 | 個人の開発環境、日常的な開発 |
結論から言うと、日常的にGitHubを使う開発者にはSSHが第一候補である。トークンの期限切れやコピペミスに悩まされず、一度鍵を登録してしまえばgit pushやgit pullが認証情報の入力なしで完了する。一方、ポート22がファイアウォールでブロックされる環境(一部の企業ネットワークなど)ではHTTPSの方が確実に動くため、そこは環境に応じて使い分けるとよい。
2. SSH鍵の仕組みを1分で
SSHは「公開鍵暗号方式」を使った公開鍵認証でGitHubとやり取りする。仕組みを正確に理解しておくと、後述のトラブルシューティングで迷わなくなる。
- 秘密鍵(例:
~/.ssh/id_ed25519)はローカルマシンにのみ置き、誰にも渡さない。 - 公開鍵(例:
~/.ssh/id_ed25519.pub)はGitHub側に登録する。名前の通り公開して構わない。 - 接続時、GitHubはランダムな文字列(チャレンジ)をクライアントに送る。クライアントは手元の秘密鍵でそれに署名し、GitHubは登録済みの公開鍵でその署名を検証する。署名が正しければ、秘密鍵の持ち主本人だと確認でき、認証が成立する。
この過程で秘密鍵そのものがネットワークを流れることは一切ない。やり取りされるのは「秘密鍵で作った署名」という一度きりの証拠だけである。

より一般的なSSHの公開鍵認証の設定(サーバー側のsshd_configやauthorized_keysの扱いなど)を詳しく知りたい場合は、https://yuhi-sa.github.io/posts/20211121_linux/5/ で解説しているので参考にしてほしい。
3. ed25519でSSH鍵を作成する
3.1 既存の鍵を確認する
まず、すでに鍵を持っていないか確認する。使い回しは避け、サービスやマシンごとに鍵を分けるのが基本だが、既存の構成を把握してから進めたい。
ls -la ~/.ssh
id_ed25519 / id_ed25519.pub、あるいはid_rsa / id_rsa.pubのようなペアが見つかれば既存の鍵がある。GitHub用に新しく作る場合はファイル名を衝突させないよう注意する(後述の複数アカウント運用で扱う)。
3.2 ssh-keygenで鍵ペアを生成する
現在のGitHub公式ドキュメントが推奨するアルゴリズムはEd25519である。RSAより鍵長が短いにもかかわらず安全性が高く、署名・検証も高速という理由から、新規に鍵を作るなら基本的にEd25519を選んでよい。
ssh-keygen -t ed25519 -C "your_email@example.com"
-Cの後ろにはコメントとして任意の文字列を指定できる。GitHub登録メールアドレスを入れておくと、後で「どの鍵がどのアカウント用か」を~/.ssh/id_ed25519.pubの中身を見ただけで判別しやすくなる。
もしハードウェアセキュリティキー(YubiKeyなど)がEd25519に対応していない環境では、代替としてecdsa-skやed25519-sk(セキュリティキー対応版)が使える。
コマンドを実行すると、次の2つを聞かれる。
保存場所: 特にこだわりがなければデフォルトのままEnterでよい。
Enter a file in which to save the key (/Users/you/.ssh/id_ed25519): [Enter]
パスフレーズ: 秘密鍵ファイル自体を暗号化して保護するための追加のパスワードである。設定を強く推奨する。
Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [同じものを再入力]
パスフレーズを設定しても、後述するssh-agent(およびmacOSではKeychain連携)を使えば、ログインのたびに毎回入力を求められることはなくなる。「空でも構わないが、その場合は秘密鍵ファイルが盗まれるとそのまま鍵として使われてしまう」という点は理解した上で判断してほしい。
生成が終わると、指定したディレクトリに秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)の2ファイルが作られる。GitHubに登録するのは公開鍵(.pubが付いた方)だけである。秘密鍵は絶対に共有したりリポジトリにコミットしたりしないこと。
3.3 公開鍵の内容をコピーする
生成した公開鍵の中身をクリップボードにコピーする。OSごとに方法が異なる。
- macOS
pbcopy < ~/.ssh/id_ed25519.pub - Linux(xclipがある場合)xclipがなければ
xclip -sel clip < ~/.ssh/id_ed25519.pubcat ~/.ssh/id_ed25519.pubで表示し、手動で選択してコピーする。 - Windows(Git Bash / PowerShell)
clip < ~/.ssh/id_ed25519.pub
4. 公開鍵をGitHubに登録する
公開鍵の登録は、Web UIから行う方法とGitHub CLI(gh)から行う方法の2通りがある。
4.1 Web UIから登録する
- GitHubにログインし、右上のプロフィールアイコンから「Settings」を開く。
- 左サイドバーの「SSH and GPG keys」を選択する。
- 「New SSH key」(または「Add SSH key」)をクリックする。
- 「Title」に鍵を識別しやすい名前(例:
MacBook Pro 2026)を入力する。 - 「Key type」は認証用途なら「Authentication Key」のままでよい(コミット署名用の鍵を別途登録する場合は「Signing Key」を選ぶ)。
- 「Key」欄に、先ほどコピーした公開鍵の内容を貼り付ける。
- 「Add SSH key」をクリックして登録を完了する。
4.2 gh CLIから登録する
GitHub CLIがインストール済みでgh auth login済みであれば、コマンド一発で登録できる。
gh ssh-key add ~/.ssh/id_ed25519.pub --title "MacBook Pro 2026"
コミット署名用の鍵として登録したい場合は--type signingを付ける。
gh ssh-key add ~/.ssh/id_ed25519.pub --type signing --title "MacBook Pro 2026 (signing)"
5. ssh-agentと~/.ssh/configの設定
鍵を作って登録しただけでは、接続のたびにパスフレーズの入力を求められる(パスフレーズを設定した場合)。ssh-agentに鍵を登録しておくことで、この手間をなくせる。
5.1 ssh-agentを起動する
macOS / Linux共通
eval "$(ssh-agent -s)"
5.2 ~/.ssh/configを設定する
~/.ssh/config(存在しなければ新規作成)に、GitHub用のホスト設定を追記する。
macOS(Sierra 10.12.2以降、Keychain連携あり)
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
UseKeychain yesを指定しておくと、一度入力したパスフレーズがmacOSのKeychainに保存され、再起動後もssh-agentへ自動的に読み込まれる。パスフレーズを設定していない場合はUseKeychainの行ごと省略してよい。
鍵をssh-agentとKeychainの両方に登録するには、次のコマンドを一度実行する。
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
(macOS Montereyより前のバージョンでは--apple-use-keychainの代わりに-Kフラグを使う。)
Linux
Host github.com
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
Keychain相当の永続化にはGNOME Keyringやディストリビューション標準のsshトツールを使う。設定後はssh-add ~/.ssh/id_ed25519で鍵を登録する。
Windows
PowerShellを管理者権限で開き、OpenSSH Authentication Agentサービスを有効化してから起動する。
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
Git for Windowsを使っている場合、Git BashのMSYS2版sshとWindows標準のssh-agentが噛み合わず接続に失敗することがある。その場合は、Gitに常にWindows標準のsshクライアントを使わせるよう設定すると解決しやすい。
git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
5.3 鍵をssh-agentに追加する(macOS以外)
ssh-add ~/.ssh/id_ed25519
登録済みの鍵一覧は次のコマンドで確認できる。
ssh-add -l -E sha256
6. 接続テストとリモートURLの切り替え
6.1 接続テスト
設定が終わったら、実際にGitHubへSSH接続できるか確認する。
ssh -T git@github.com
初回接続時は、GitHubのホスト鍵のフィンガープリントが表示され、信頼してよいか確認を求められる。
The authenticity of host 'github.com (IP ADDRESS)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
表示されたフィンガープリントがGitHub公式が公開している値と一致することを確認した上でyesと入力する(GitHubのED25519ホスト鍵のフィンガープリントはSHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqUであり、公式ドキュメントの「GitHub’s SSH key fingerprints」ページで最新値を確認できる)。
以下のように表示されれば接続成功である。
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
usernameの部分は自分のGitHubユーザー名に置き換わる。なお、GitHubはシェルアクセスを提供しないため、このコマンドの終了コードが1になるのは正常な挙動であり、エラーではない。

6.2 既存リポジトリのリモートURLをHTTPSからSSHに切り替える
すでにHTTPSでクローンしたリポジトリがある場合、リモートURLをSSH形式に変更すれば、以後のpush/pullがSSH経由になる。
cd path/to/your/repo
git remote set-url origin git@github.com:your-username/your-repo.git
現在のリモートURLはgit remote -vで確認できる。
git remote -v
7. トラブルシューティング
SSH接続で最もよく遭遇するエラーとその対処法をまとめる。原因の切り分けには、詳細ログを出す-vオプション(-vT)が非常に有効である。
ssh -vT git@github.com
7.1 Permission denied (publickey)
最も多いエラーである。サーバー側が接続を拒否している状態で、原因はいくつか考えられる。
- ssh-agentに鍵が登録されていない:
ssh-add -l -E sha256で鍵が一覧に出るか確認する。出ていなければssh-add ~/.ssh/id_ed25519で追加する。 - 公開鍵がGitHubアカウントに登録されていない: GitHubの「SSH and GPG keys」設定ページで、フィンガープリントが一致する鍵が登録済みか確認する。ローカルの公開鍵のフィンガープリントは
ssh-keygen -lf ~/.ssh/id_ed25519.pubで確認できる。 sudoを使ってコマンドを実行した:sudo git ...のように管理者権限で実行すると、通常ユーザーで生成した鍵とは別の設定(rootの~/.ssh)が参照され、認証に失敗する。特別な理由がない限りGit操作にsudoは使わない。git@ではなく自分のGitHubユーザー名で接続しようとしている: GitHubへのSSH接続は常にgitユーザーで行う。git@github.comのgit部分を自分のユーザー名に書き換えると失敗する。
ssh -vT git@github.comの出力では、次の点に注目する。
Offering public keyとServer accepts keyが出ていれば、その鍵は正しく提示・受理されている。Trying private keyの後に鍵が見つからない旨のメッセージが続く場合、指定したパスにその鍵が存在しないか、~/.ssh/configのIdentityFile指定が間違っている。Authentications that can continue: publickeyの後に接続が切れる場合、提示した鍵がGitHub側に登録されていない可能性が高い。
7.2 Host key verification failed
SSHはセキュリティ対策として、一度接続したホストの鍵を~/.ssh/known_hostsに記録し、次回以降に鍵が変わっていないか検証する。GitHub側のインフラ変更などで想定と異なるホスト鍵が返された場合にこのエラーが出る。まず、表示されたフィンガープリントが公式に公開されているGitHubのホスト鍵フィンガープリントと一致するか確認し、一致する場合のみ~/.ssh/known_hostsの該当行を削除して再接続する。身に覚えのない状況で警告が出た場合は、中間者攻撃の可能性もあるため安易にyesと答えず、まずネットワーク環境を疑うこと。
7.3 その他のエラー
- Bad file number: ファイアウォールやプロキシがSSH(ポート22)の通信をブロックしていることが多い。後述のようにポート443経由での接続を試す。
- Key already in use: 同じ公開鍵がすでに別のGitHubアカウントやリポジトリのデプロイキーとして登録されている場合に出る。1つの鍵は1アカウントのみで使うのが基本である。
- ポート22がブロックされる環境での回避策:
~/.ssh/configに以下を追記すると、ポート443経由でSSH接続できる。Host github.com Hostname ssh.github.com Port 443 User git
応用: 複数アカウントの使い分け
仕事用とプライベート用など、複数のGitHubアカウントを1台のマシンで使い分けたい場合は、アカウントごとに鍵を分け、~/.ssh/configにHostエイリアスを設定する。
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work
ssh-keygen -t ed25519 -C "personal@example.com" -f ~/.ssh/id_ed25519_personal
それぞれの公開鍵を対応するGitHubアカウントに登録した上で、~/.ssh/configに以下のようにHostエイリアスを設定する。
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
クローンやリモートURLの設定時に、実際のホスト名の代わりにエイリアスを使う。
git clone git@github.com-work:work-org/repo.git
# 既存リポジトリなら
git remote set-url origin git@github.com-personal:your-username/repo.git
IdentitiesOnly yesを指定しておくと、ssh-agentに他の鍵が登録されていても指定したIdentityFileだけが使われるため、意図しない鍵での接続を防げる。
まとめ
GitHubへのSSH接続設定は、次の流れで完了する。
ssh-keygen -t ed25519でed25519鍵ペアを作成する- 公開鍵(
.pub)だけをGitHubに登録する(Web UIまたはgh ssh-key add) - ssh-agentと
~/.ssh/configを設定し、パスフレーズの再入力を不要にする ssh -T git@github.comで接続を確認する- 既存リポジトリのリモートURLをSSH形式に切り替える
つまずいた場合は、ssh -vT git@github.comの詳細ログを読み、「鍵が提示されているか」「GitHub側に登録されているか」の2点を順に確認すれば、大半のエラーは解決できる。
よくある質問(FAQ)
Q. ed25519とRSAどちらを使うべきか? A. 新規に鍵を作るなら基本的にed25519でよい。鍵長が短いにもかかわらず安全性が高く、生成・署名も高速である。既存のRSA鍵をすでに使っている場合、GitHubはRSA鍵も引き続きサポートしているため急いで作り直す必要はないが、2021年11月2日以降に生成されたRSA鍵はSHA-2署名アルゴリズムの使用が必須になっている点は覚えておくとよい(一般的なOpenSSHクライアントは自動的に対応済みの署名方式を使うため、通常は意識する必要はない)。
Q. パスフレーズは設定すべきか? A. 設定を推奨する。パスフレーズなしの秘密鍵は、ファイルさえ盗まれればそのまま認証に使われてしまう。ssh-agent(macOSならKeychain連携)を設定しておけば、パスフレーズを設定していても毎回の入力は不要になるため、利便性を犠牲にせずセキュリティを高められる。
Q. 公開鍵と秘密鍵、どちらをGitHubに登録する?
A. 公開鍵(id_ed25519.pubなど、.pub拡張子が付いたファイル)を登録する。秘密鍵(.pubが付かない方)は誰にも渡さず、ローカルマシンにのみ保管する。
Q. 毎回パスフレーズを聞かれるのを止めるには?
A. ssh-agentに鍵を追加し(ssh-add ~/.ssh/id_ed25519)、~/.ssh/configにAddKeysToAgent yesを設定する。macOSではさらにUseKeychain yesを追加し、ssh-add --apple-use-keychain ~/.ssh/id_ed25519を一度実行しておけば、再起動後もパスフレーズの入力なしで接続できる。
関連書籍
Git・GitHubをコマンドラインから体系的に学び直したい読者には、入門書の定番として次の一冊を挙げておく。
他の分野の定番書は エンジニアにおすすめの技術書10選 にまとめている。
参考文献
- GitHub Docs: Connecting to GitHub with SSH
- GitHub Docs: About SSH
- GitHub Docs: Generating a new SSH key and adding it to the ssh-agent
- GitHub Docs: Adding a new SSH key to your GitHub account
- GitHub Docs: Testing your SSH connection
- GitHub Docs: GitHub’s SSH key fingerprints
- GitHub Docs: Troubleshooting SSH
- GitHub Docs: Error: Permission denied (publickey)
- GitHub Docs: Using SSH over the HTTPS port