SSH キーは非対称暗号を使ってパスワードなしのログインと認証を実現します。パスワードより安全で便利です。この記事では日常開発でよくある状況をひととおり解説します。
アルゴリズムの選択
キーを生成する前に、まずアルゴリズムを決めましょう。
| アルゴリズム | 推奨度 | 説明 |
|---|---|---|
| Ed25519 | ✅ 第一候補 | 現代的な楕円曲線アルゴリズム。鍵が短く、速く、安全性が高い |
| RSA 4096 | ✅ 互換用 | 互換性が最も高い。レガシーシステムに必須。鍵が長い |
| ECDSA | ⚠️ 可 | RSA より短いが、一部の実装に問題あり |
| RSA 2048 | ❌ 非推奨 | 現在は強度不足とされている |
| DSA | ❌ 非推奨 | 廃止済み |
結論:新しい環境では Ed25519 を優先し、レガシーシステムとの互換が必要な場合のみ RSA 4096 を使いましょう。
基本:最初の SSH キーを生成する
Ed25519(推奨)
ssh-keygen -t ed25519 -C "your_email@example.com"
RSA 4096(互換用)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
実行すると次のプロンプトが表示されます:
Enter file in which to save the key (/Users/you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
- ファイルパス:Enter でデフォルトパスを使用
- パスフレーズ:設定推奨。秘密鍵に追加のパスワード保護をかけます
生成後:
~/.ssh/id_ed25519— 秘密鍵。絶対に公開・アップロードしないこと~/.ssh/id_ed25519.pub— 公開鍵。各プラットフォームに貼り付けて使う
公開鍵の内容を確認する
cat ~/.ssh/id_ed25519.pub
出力例:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com
この一行をコピーして GitHub / GitLab / サーバーの authorized_keys に貼り付けます。
ケース1:複数プラットフォーム・複数アカウント(最も一般的)
個人の GitHub アカウント、会社の GitHub アカウント、GitLab、社内サーバーを同時に使うことはよくあります。それぞれ独立した鍵が必要です。
ステップ1:複数の鍵を生成し、それぞれ名前を付ける
# 個人 GitHub
ssh-keygen -t ed25519 -C "me@personal.com" -f ~/.ssh/id_ed25519_github_personal
# 会社 GitHub
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_github_work
# GitLab
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_gitlab
# 社内サーバー
ssh-keygen -t ed25519 -C "server" -f ~/.ssh/id_ed25519_server
ステップ2:~/.ssh/config を設定する
# 個人 GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_personal
# 会社 GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_work
# GitLab
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_gitlab
# 社内サーバー
Host dev-server
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519_server
ステップ3:エイリアスを使って操作する
# 個人リポジトリをクローン(github.com を Host エイリアスに置き換える)
git clone git@github-personal:username/repo.git
# 会社リポジトリをクローン
git clone git@github-work:company/repo.git
# サーバーに直接 SSH ログイン
ssh dev-server
ケース2:ssh-agent に登録する
秘密鍵にパスフレーズを設定している場合、毎回入力が必要になります。ssh-agent はセッション中パスフレーズを記憶してくれます。
# agent を起動(通常は自動起動済み)
eval "$(ssh-agent -s)"
# 秘密鍵を agent に追加
ssh-add ~/.ssh/id_ed25519
# 登録済みの鍵を確認
ssh-add -l
macOS での永続化(Keychain に保存して再起動後も再登録不要):
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
~/.ssh/config に以下を追加して macOS が自動的に Keychain を使うようにします:
Host *
AddKeysToAgent yes
UseKeychain yes
ケース3:公開鍵をサーバーに配置する
方法1:ssh-copy-id(最も簡単)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
方法2:パイプで転送
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
方法3:サーバー上で直接編集
サーバーにログイン後:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "公開鍵の内容を貼り付け" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
パーミッションが間違っていると SSH が拒否します:
| パス | パーミッション |
|---|---|
~/.ssh/ | 700 |
~/.ssh/authorized_keys | 600 |
| 秘密鍵ファイル | 600 |
| 公開鍵ファイル | 644 |
ケース4:Windows 環境
Windows にはいくつかの異なる設定が必要です。
Git Bash / WSL
macOS/Linux とほぼ同じ手順です。~/.ssh/ パスも同様に使えます。
PowerShell(内蔵 OpenSSH)
Windows 10 1809 以降は OpenSSH が標準搭載されています:
# 鍵を生成
ssh-keygen -t ed25519 -C "your_email@example.com"
# 鍵の保存先:
# C:\Users\ユーザー名\.ssh\id_ed25519
ssh-agent サービスを有効化
# 管理者として実行
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
# 鍵を追加
ssh-add $env:USERPROFILE\.ssh\id_ed25519
ケース5:接続テスト
設定後、正常に動作するか確認します:
# GitHub をテスト
ssh -T git@github.com
# 出力: Hi username! You've successfully authenticated...
# エイリアスでテスト
ssh -T git@github-personal
# サーバーをテスト(-v で詳細ログを表示、トラブルシュート用)
ssh -v user@server_ip
ケース6:鍵の更新・失効
新しい鍵を生成した後、必要な作業:
- 新しい公開鍵をすべてのプラットフォーム / サーバーに追加
- 古い公開鍵を各プラットフォーム / サーバーから削除
- ローカルの古い秘密鍵ファイルを削除(任意)
# agent から古い鍵を削除
ssh-add -d ~/.ssh/old_key
# 古い鍵ファイルを削除
rm ~/.ssh/old_key ~/.ssh/old_key.pub
サーバー上で古い公開鍵を削除:
# authorized_keys を編集して該当行を削除
nano ~/.ssh/authorized_keys
よくある問題
Permission denied (publickey)
- 公開鍵が対象プラットフォームに追加されているか確認
~/.ssh/authorized_keysのパーミッションが 600 か確認ssh -vでハンドシェイクの詳細を確認
毎回パスフレーズを求められる
- ssh-agent に登録する:
ssh-add ~/.ssh/id_ed25519 - macOS では
--apple-use-keychainで永続化
git がどの鍵を使っているか確認したい
# 現在のアイデンティティを確認
ssh -T git@github.com
# 特定の鍵を指定してテスト
ssh -i ~/.ssh/id_ed25519_github_personal -T git@github.com
Fonnpo