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.pubGitHubアカウント署名の検証サービスに自由に登録可能

SSH接続時の認証フローは次の4段階で進みます。

  1. ローカルPCからGitHubへSSH接続を要求する
  2. GitHubがランダムなデータ(チャレンジ)を送信する
  3. ローカルPCが秘密鍵でチャレンジに電子署名し、GitHubに返送する
  4. GitHubが登録済みの公開鍵で署名を検証し、正当性が確認できれば接続を許可する

秘密鍵でなければ正しい署名を生成できないため、秘密鍵を持つ本人だけがGitHubへの認証を通過できます。秘密鍵の流出は第三者によるなりすましに直結するため、厳重な管理が求められます。

既存のSSH鍵を確認する

新しい鍵を作成する前に、PCにSSH鍵が既に存在するかを確認します。

ls -al ~/.ssh

以下のようなファイルがあれば、対応するSSH鍵が生成済みです。

ファイル名アルゴリズム備考
id_ed25519 / id_ed25519.pubEd25519現在の推奨
id_rsa / id_rsa.pubRSAレガシー環境向け
id_ecdsa / id_ecdsa.pubECDSA楕円曲線系の旧方式

~/.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の比較

項目Ed25519RSA 4096ECDSA
安全性レベル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から登録する

  1. GitHubにログインし、右上のプロフィールアイコンから Settings を開く
  2. サイドバー「Access」セクションの SSH and GPG keys を選択
  3. New SSH key をクリック
  4. Title にPCや用途を識別するラベルを入力(例: Ubuntu Desktop 2026
  5. Key type で用途に応じた種類を選択
  6. Key 欄にコピーした公開鍵を貼り付ける
  7. Add SSH key をクリックし、アカウント認証(パスワード or 2FA)で確認

Key typeは次の2種類から選択します。

Key type用途
Authentication Keyリポジトリへのpush / pull / cloneの認証
Signing KeyGitコミットやタグへの電子署名

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フィンガープリント
Ed25519SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
RSASHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
ECDSASHA256: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 -lssh-add ~/.ssh/id_ed25519
秘密鍵のパーミッションが緩いls -la ~/.ssh/id_ed25519chmod 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)
config600(所有者のみ 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ステップに集約されます。

  1. ssh-keygen -t ed25519 -C "メールアドレス" で鍵ペアを生成する
  2. ssh-agentを起動し、秘密鍵を登録する
  3. 公開鍵をコピーしてGitHub Settings → SSH and GPG keysに登録する
  4. ssh -T git@github.com で接続が成功することを確認する
  5. リポジトリのリモートURLを git@github.com: 形式に変更する

Ed25519は鍵長が短く計算も高速なため、特別な理由がない限りEd25519を選択してください。パスフレーズの設定とssh-agentの活用を組み合わせれば、セキュリティと利便性を両立できます。