GitHubでは2021年8月13日にコマンドラインからのパスワード認証が廃止されました。現在、GitHubリポジトリへpushやcloneを行うには、SSH鍵認証またはPersonal Access Token(PAT)による認証が必須です。
SSH鍵認証は「公開鍵暗号方式」に基づいた認証方式で、一度設定すれば操作のたびにパスワードやトークンを入力する必要がなくなります。秘密鍵と公開鍵の2つのファイルをペアで生成し、公開鍵をGitHubに登録、秘密鍵はローカルPCに保管する仕組みです。
公開鍵暗号方式によるSSH認証の仕組み
SSH認証では「秘密鍵」と「公開鍵」の2つがペアで機能します。
| 鍵の種類 | 保管場所 | 用途 | 取り扱い |
|---|---|---|---|
秘密鍵(id_ed25519) | ローカルPC ~/.ssh/ | データへの電子署名 | 外部に公開しない |
公開鍵(id_ed25519.pub) | GitHubアカウント | 署名の検証 | サービスに自由に登録可能 |
SSH接続時の認証フローは次の4段階で進みます。
- ローカルPCからGitHubへSSH接続を要求する
- GitHubがランダムなデータ(チャレンジ)を送信する
- ローカルPCが秘密鍵でチャレンジに電子署名し、GitHubに返送する
- GitHubが登録済みの公開鍵で署名を検証し、正当性が確認できれば接続を許可する
秘密鍵でなければ正しい署名を生成できないため、秘密鍵を持つ本人だけがGitHubへの認証を通過できます。秘密鍵の流出は第三者によるなりすましに直結するため、厳重な管理が求められます。
既存のSSH鍵を確認する
新しい鍵を作成する前に、PCにSSH鍵が既に存在するかを確認します。
ls -al ~/.ssh
以下のようなファイルがあれば、対応するSSH鍵が生成済みです。
| ファイル名 | アルゴリズム | 備考 |
|---|---|---|
id_ed25519 / id_ed25519.pub | Ed25519 | 現在の推奨 |
id_rsa / id_rsa.pub | RSA | レガシー環境向け |
id_ecdsa / id_ecdsa.pub | ECDSA | 楕円曲線系の旧方式 |
~/.ssh ディレクトリ自体が存在しない場合(No such file or directory と表示)は、次のステップで鍵を新規生成してください。
既存の鍵がある場合、そのままGitHubに登録して使用できます。ただし、RSA鍵でビット長が2048未満のものは現在のセキュリティ基準を満たさないため、Ed25519で新規生成することを推奨します。
ssh-keygenでSSH鍵ペアを生成する
Ed25519鍵を生成する(GitHub推奨)
GitHubが公式に推奨するアルゴリズムはEd25519です。ターミナル(macOS / Linux)またはGit Bash(Windows)で以下を実行します。
ssh-keygen -t ed25519 -C "your_email@example.com"
オプションの説明:
| オプション | 役割 |
|---|---|
-t ed25519 | 鍵のアルゴリズムをEd25519に指定 |
-C "メールアドレス" | 鍵にラベルを付与(GitHubアカウントのメールアドレスが一般的) |
-f ファイルパス | 保存先を明示指定(省略するとデフォルトパス ~/.ssh/id_ed25519) |
-N "パスフレーズ" | パスフレーズを対話なしで指定(スクリプトでの自動生成向け) |
実行後、対話形式で保存先とパスフレーズを聞かれます。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/you/.ssh/id_ed25519):
保存先はデフォルトのまま(Enter)で問題ありません。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
パスフレーズは秘密鍵を暗号化するための追加パスワードです。設定の判断基準は後述しますが、セキュリティの観点では設定が推奨されます。空Enterで省略も可能です。
生成が完了すると ~/.ssh/ に2つのファイルが作成されます。
id_ed25519— 秘密鍵(絶対に他者と共有しない)id_ed25519.pub— 公開鍵(GitHubに登録するファイル)
RSA 4096ビット鍵を生成する(Ed25519非対応環境向け)
OpenSSH 6.5より古い環境ではEd25519を利用できません。その場合はRSA 4096ビットの鍵を生成します。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-b 4096 で鍵のビット長を指定します。2048ビット以下のRSA鍵はセキュリティ強度が不足する可能性があるため、4096ビットを推奨します。
Ed25519 / RSA / ECDSAの比較
| 項目 | Ed25519 | RSA 4096 | ECDSA |
|---|---|---|---|
| 安全性レベル | 128ビット相当 | 約140ビット相当 | 鍵長に依存 |
| 秘密鍵の長さ | 256ビット固定 | 4096ビット | 256 / 384ビット |
| 公開鍵のサイズ | 約68文字 | 約550文字 | 約180文字 |
| 署名・検証速度 | 高速 | やや低速 | 中程度 |
| 最小要件 | OpenSSH 6.5+ | OpenSSH全般 | OpenSSH 5.7+ |
| GitHub推奨 | 第一推奨 | レガシー向け代替 | 非推奨ではないが特段推奨されていない |
macOS 10.12以降、Windows 10(OpenSSH 1803以降)、Ubuntu 14.04以降の環境ではEd25519を利用できます。
注意: GitHubは2022年3月15日にDSA鍵(
ssh-dss)のサポートを完全廃止しました。DSA鍵を使用している場合はEd25519で再生成が必要です。また、2021年11月2日以降に生成されたRSA鍵はSHA-2署名アルゴリズムの使用が必須となっています。
パスフレーズの設定方針
パスフレーズを設定すると、秘密鍵ファイルがAES暗号で保護されます。PCの盗難やディスクへの不正アクセスがあっても、パスフレーズを知らなければ秘密鍵を利用できません。
設定を推奨するケース:
- 社用PCやノートPCで開発している
- 複数人でマシンを共用する環境がある
- 業務用リポジトリ(プライベートリポジトリ)にアクセスする
省略してもよいケース:
- CI/CDパイプラインから自動で鍵を使用する
- フルディスク暗号化済みの個人専用デスクトップPCを使っている
パスフレーズを設定すると、SSH接続のたびに入力を求められます。この手間はssh-agentで解消できるため、次のセクションで設定方法を確認してください。
ssh-agentで秘密鍵を管理する
ssh-agentはバックグラウンドで動作するプロセスで、一度入力したパスフレーズをメモリ上に保持し、以降のSSH接続でパスフレーズ入力を自動化します。
macOS
1. ~/.ssh/config を作成して設定を追記する
touch ~/.ssh/config
ファイルを開き、以下を記述します。
Host github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
UseKeychain yes を指定すると、パスフレーズがmacOSのキーチェーンに保存され、OS再起動後も再入力が不要になります。
2. 秘密鍵をssh-agentに追加する
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
--apple-use-keychain はmacOS標準のssh-addでのみ使えるオプションです。Homebrewなどで別バージョンのssh-addをインストールしている場合は、/usr/bin/ssh-add のフルパスで実行してください。
Windows
Git Bashの場合:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Agent pid XXXXX と表示されればssh-agentが起動しています。
PowerShellの場合(管理者権限で実行):
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
PowerShellでssh-agentをサービス起動すると、Git Bash・コマンドプロンプト・VS Code統合ターミナルなど、全てのシェルから同一のssh-agentを参照できます。
Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ログイン時にssh-agentを自動起動するには、~/.bashrc や ~/.zshrc に以下を追記します。
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)" > /dev/null
fi
ssh-agentの動作確認:
現在ssh-agentに登録されている鍵の一覧を表示するコマンドです。
ssh-add -l
鍵が登録されていれば、フィンガープリントとファイルパスが出力されます。The agent has no identities. と表示された場合は鍵が未登録です。
公開鍵をGitHubに登録する
公開鍵をコピーする
macOS:
pbcopy < ~/.ssh/id_ed25519.pub
Windows(Git Bash):
clip < ~/.ssh/id_ed25519.pub
Linux:
cat ~/.ssh/id_ed25519.pub
出力されたテキスト全体(ssh-ed25519 AAAA... で始まる1行)をマウスで選択してコピーします。コピー時に改行や余分な空白が入らないよう注意してください。
Web UIから登録する
- GitHubにログインし、右上のプロフィールアイコンから Settings を開く
- サイドバー「Access」セクションの SSH and GPG keys を選択
- New SSH key をクリック
- Title にPCや用途を識別するラベルを入力(例:
Ubuntu Desktop 2026) - Key type で用途に応じた種類を選択
- Key 欄にコピーした公開鍵を貼り付ける
- Add SSH key をクリックし、アカウント認証(パスワード or 2FA)で確認
Key typeは次の2種類から選択します。
| Key type | 用途 |
|---|---|
| Authentication Key | リポジトリへのpush / pull / cloneの認証 |
| Signing Key | Gitコミットやタグへの電子署名 |
1つの公開鍵を認証と署名の両方に使う場合は、それぞれのKey typeで2回登録する必要があります。
GitHub CLI(ghコマンド)から登録する
GitHub CLIがインストール済みであれば、コマンドラインから直接登録できます。
gh ssh-key add ~/.ssh/id_ed25519.pub --title "Ubuntu Desktop 2026" --type authentication
署名用に追加する場合:
gh ssh-key add ~/.ssh/id_ed25519.pub --title "Ubuntu Desktop 2026 signing" --type signing
SSH接続をテストする
ssh -T git@github.com
初回接続時はホスト認証の確認メッセージが表示されます。
The authenticity of host 'github.com (20.27.177.113)' 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公式のSSHフィンガープリントは以下のとおりです。
| アルゴリズム | SHA256フィンガープリント |
|---|---|
| Ed25519 | SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU |
| RSA | SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s |
| ECDSA | SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM |
yes を入力すると ~/.ssh/known_hosts にGitHubのホストキーが保存され、次回以降はこの確認は表示されません。
接続成功時の出力:
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
USERNAME に自分のGitHubユーザー名が表示されていれば設定完了です。このコマンドは終了コード1を返しますが、正常な動作です。
既存リポジトリをHTTPSからSSHに切り替える
HTTPS経由でcloneしたリポジトリのリモートURLをSSH形式に変更します。
# 現在のリモートURLを確認
git remote -v
# SSH形式に変更
git remote set-url origin git@github.com:username/repo.git
# 変更を確認
git remote -v
SSH切替後の出力:
origin git@github.com:username/repo.git (fetch)
origin git@github.com:username/repo.git (push)
新しいリポジトリをcloneする際は、GitHubリポジトリページの「Code」ボタンから「SSH」タブを選択し、表示されるURLを使います。
git clone git@github.com:username/repo.git
複数のGitHubアカウントで鍵を使い分ける
個人用と業務用など、異なるGitHubアカウントを持っている場合は ~/.ssh/config でHostエイリアスを設定して鍵を切り替えます。
1. アカウントごとに鍵を生成する
ssh-keygen -t ed25519 -C "personal@example.com" -f ~/.ssh/id_ed25519_personal
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_work
2. ~/.ssh/config にHost別の設定を記述する
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
IdentitiesOnly yes を指定すると、ssh-agentに複数の鍵が登録されていても、IdentityFileで指定した鍵だけが使用されます。意図しない鍵で認証されるトラブルを防止できます。
3. Hostエイリアスでclone / push / pullする
# 個人アカウントのリポジトリ
git clone git@github-personal:my-user/my-repo.git
# 業務アカウントのリポジトリ
git clone git@github-work:company-org/project.git
既存リポジトリのリモートURLも同様に変更します。
git remote set-url origin git@github-work:company-org/project.git
ポート22がブロックされている環境での対処
企業ネットワークやファイアウォール設定によりSSH標準ポート(22番)が遮断されている場合、GitHubはHTTPSポート(443番)経由のSSH接続をサポートしています。
まず443経由の接続が可能か確認します。
ssh -T -p 443 git@ssh.github.com
成功したら ~/.ssh/config に以下を追記します。
Host github.com
Hostname ssh.github.com
Port 443
User git
以降は通常どおり git@github.com でSSH接続が可能です。ホスト名を ssh.github.com に変更し、ポートを443に指定している点がポイントです。
SSH接続のトラブルシューティング
Permission denied (publickey)
最も多いエラーです。原因の切り分け手順を示します。
1. デバッグモードで接続を試行する
ssh -vT git@github.com
-v オプションにより、どの鍵が試行されたか、どのステップで失敗したかが出力されます。
2. 主な原因と対処
| 原因 | 確認方法 | 対処 |
|---|---|---|
| 公開鍵がGitHubに未登録 | GitHub Settings → SSH and GPG keys | 公開鍵を登録 |
| ssh-agentに鍵が未追加 | ssh-add -l | ssh-add ~/.ssh/id_ed25519 |
| 秘密鍵のパーミッションが緩い | ls -la ~/.ssh/id_ed25519 | chmod 600 ~/.ssh/id_ed25519 |
| configのIdentityFileパスが誤り | cat ~/.ssh/config | パスを修正 |
| デフォルト名以外の鍵を使用中 | -v の出力で確認 | configにIdentityFileを明記 |
Bad owner or permissions on ~/.ssh/config
~/.ssh/config のファイル権限が緩すぎる場合に発生します。
chmod 600 ~/.ssh/config
chmod 700 ~/.ssh
鍵の上書きを防ぐ
ssh-keygen実行時に同名ファイルがある場合、上書き確認が表示されます。
/home/you/.ssh/id_ed25519 already exists.
Overwrite (y/n)?
n で上書きを回避し、-f オプションで別名を指定して生成してください。
SSH鍵のセキュリティ対策
ファイル権限を正しく設定する
SSHクライアントは鍵ファイルの権限が緩いと接続を拒否します。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/config
| 対象 | 推奨パーミッション |
|---|---|
~/.ssh/ ディレクトリ | 700(所有者のみ rwx) |
| 秘密鍵 | 600(所有者のみ rw) |
| 公開鍵 | 644(所有者 rw / 他 r) |
| config | 600(所有者のみ rw) |
秘密鍵の漏洩を防止する
- Gitリポジトリ内に秘密鍵ファイルを配置しない
- Slack・メール・チャットで秘密鍵を送信しない
- クラウドストレージ(Google Drive、Dropbox等)への保存を避ける
- GitHubのSecret Scanningは、誤ってpushされたSSH秘密鍵を検知します。検知通知を受け取った場合は、直ちにGitHubから該当の公開鍵を削除し、新しい鍵ペアを再生成してください
不要な鍵を定期的に棚卸しする
GitHubは1年間未使用のSSH鍵を自動削除します。使わなくなったPCやアカウントに紐づく鍵は、GitHub Settings → SSH and GPG keysから手動で削除しておくとより安全です。
ローカルの鍵ファイルも合わせて削除します。
rm ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
SSHとHTTPS+PATの認証方式を比較する
| 比較項目 | SSH鍵認証 | HTTPS + PAT認証 |
|---|---|---|
| 初期設定 | ssh-keygenで鍵ペア生成 → GitHubに公開鍵登録 | GitHub Settings → Developer settings → PATを発行 |
| 認証操作 | ssh-agent利用で自動認証 | credential helper設定で自動化可能 |
| 安全性 | 秘密鍵がPC外に出ない | トークン文字列の管理が必要 |
| 利用ポート | 22番(443経由も可) | 443番 |
| 複数アカウント | ~/.ssh/config で切替 | credential helper設定で切替 |
| コミット署名 | SSH署名に対応(2022年8月〜) | 別途GPG鍵が必要 |
| 有効期限 | 1年間未使用で自動削除 | 発行時に有効期限を設定 |
ポート22が使えない環境でもSSH接続は443経由で利用可能なため、ほとんどのケースでSSH鍵認証が実用的な選択肢になります。
まとめ
GitHubへのSSH接続に必要な作業は、次の5ステップに集約されます。
ssh-keygen -t ed25519 -C "メールアドレス"で鍵ペアを生成する- ssh-agentを起動し、秘密鍵を登録する
- 公開鍵をコピーしてGitHub Settings → SSH and GPG keysに登録する
ssh -T git@github.comで接続が成功することを確認する- リポジトリのリモートURLを
git@github.com:形式に変更する
Ed25519は鍵長が短く計算も高速なため、特別な理由がない限りEd25519を選択してください。パスフレーズの設定とssh-agentの活用を組み合わせれば、セキュリティと利便性を両立できます。