ssh-keygen(ssh keygen)は、SSH接続に使用する公開鍵・秘密鍵のペアを生成・管理するコマンドです。
GitHubへのプッシュやリモートサーバーへのパスワードなしログインを実現するために広く使われています。
このページでは、SSH鍵の作成手順から、GitHubへの登録・サーバーへの接続設定・権限設定・よくあるエラーまでまとめて解説します。
SSH鍵とは?公開鍵と秘密鍵の違い
SSHの公開鍵認証では、公開鍵(public key)と秘密鍵(private key)の2つのファイルをペアで使います。
| 種類 | ファイル名(例) | 役割 | 管理方法 |
|---|---|---|---|
| 秘密鍵 | ~/.ssh/id_ed25519 | 認証に使う鍵。自分だけが持つ | 絶対に外部に渡さない |
| 公開鍵 | ~/.ssh/id_ed25519.pub | サーバーやGitHubに登録する鍵 | 公開しても問題ない |
仕組みとしては、公開鍵を接続先(GitHubやサーバー)に登録し、秘密鍵で認証するという流れです。秘密鍵が手元にあることで、パスワード入力なしにログインできます。
SSH鍵の作成手順
推奨:Ed25519鍵を作成する
特別な理由がなければ、Ed25519を使います。高速で安全性が高く、現行のOpenSSHで最も推奨される鍵形式です。
ssh-keygen -t ed25519 -C "your-email@example.com"
-Cにメールアドレスを指定すると、どの鍵か識別しやすくなります(必須ではありません)。
RSA鍵を作成する(互換性が必要な場合)
古い環境や特殊なネットワーク機器でEd25519が使えない場合は、RSA(4096bit)を選びます。
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
実行時の対話プロンプト
コマンドを実行すると、以下の3つを順番に聞かれます。
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519): ← Enterで規定の保存先
Enter passphrase (empty for no passphrase): ← パスフレーズを入力
Enter same passphrase again: ← 確認入力
保存先を指定する(-f オプション)
デフォルトは ~/.ssh/id_ed25519(Ed25519の場合)です。複数の鍵を使い分ける場合や、用途別に名前をつけたい場合は -f で指定します。
# GitHub用の鍵として保存先を指定
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/id_ed25519_github
パスフレーズとは?設定すべきか
パスフレーズは秘密鍵を保護するための暗号化パスワードです。設定すると、秘密鍵ファイルが盗まれても即座に悪用されません。
- 設定推奨:本番環境・業務利用・GitHubへのアクセス
- 空でも可:ローカルの検証環境や自動化スクリプト用の鍵(ただしリスクを理解した上で)
パスフレーズを設定しても、ssh-agent を使えば毎回入力する手間を省けます。
既存の鍵を上書きしないよう注意
保存先に同名のファイルが存在する場合、上書きするか確認されます。
/home/user/.ssh/id_ed25519 already exists.
Overwrite (y/n)?
既存の鍵をすでに使っている場合は n を入力してキャンセルし、-f で別のファイル名を指定してください。上書きすると元の秘密鍵は失われ、既存のSSH設定が使えなくなります。
作成されるファイル
鍵の生成が完了すると、~/.ssh/ に2つのファイルが作成されます。
| ファイル | 内容 | 用途 |
|---|---|---|
id_ed25519 | 秘密鍵 | 手元の端末で保持する。絶対に公開しない |
id_ed25519.pub | 公開鍵 | GitHubやサーバーに登録する |
公開鍵の内容を確認する
cat ~/.ssh/id_ed25519.pub
出力例:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your-email@example.com
この文字列全体をGitHubやサーバーに貼り付けます。
GitHubにSSH鍵を登録する
GitHubにSSH鍵を登録することで、HTTPS認証(パスワード)ではなくSSH認証でgit pushやgit cloneができるようになります。
- 公開鍵の内容をコピーする
cat ~/.ssh/id_ed25519.pub
# 表示された文字列をすべてコピー
- GitHubの設定ページを開く
GitHub → Settings → SSH and GPG keys → New SSH key
- タイトルを入力し、Keyフィールドに公開鍵の内容を貼り付けて「Add SSH key」をクリック
ssh-agentに秘密鍵を追加する
パスフレーズを設定した場合、接続のたびに入力が必要です。ssh-agentを使うと、一度入力するだけでセッション中はキャッシュされます。
# ssh-agentを起動
eval "$(ssh-agent -s)"
# 秘密鍵を追加
ssh-add ~/.ssh/id_ed25519
macOSの場合、~/.ssh/configに以下を記述するとログイン時に自動で追加されます。
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed25519
SSH接続テスト
GitHubへの接続が正しく設定されているか確認します。
ssh -T git@github.com
成功した場合の出力例:
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
一般的なサーバーへの接続テスト:
ssh -i ~/.ssh/id_ed25519 user@hostname
サーバーに公開鍵を登録する(authorized_keys)
自分で管理するリモートサーバーにSSHキー認証でログインするには、サーバー側の ~/.ssh/authorized_keys に公開鍵を追加します。
ssh-copy-idを使う(推奨)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@hostname
このコマンドが使えない場合は手動で追加します。
手動で追加する
# サーバーに~/.sshディレクトリを作成
ssh user@hostname "mkdir -p ~/.ssh && chmod 700 ~/.ssh"
# 公開鍵を追記
cat ~/.ssh/id_ed25519.pub | ssh user@hostname "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
権限設定(パーミッション)
SSHは鍵ファイルやディレクトリの権限が緩いと接続を拒否します。以下の権限が必要です。
| 対象 | 権限 | 設定コマンド |
|---|---|---|
~/.ssh/ | 700 | chmod 700 ~/.ssh |
秘密鍵(例: id_ed25519) | 600 | chmod 600 ~/.ssh/id_ed25519 |
公開鍵(例: id_ed25519.pub) | 644 | chmod 644 ~/.ssh/id_ed25519.pub |
authorized_keys(サーバー側) | 600 | chmod 600 ~/.ssh/authorized_keys |
# まとめて設定する例
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
構文(Syntax)
ssh-keygen [オプション]
ssh-keygen の主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | 対話的に新しい鍵ペアを生成(デフォルト: ~/.ssh/id_rsa) | ssh-keygen |
-t <type> | 鍵の種類を指定(rsa, ed25519, ecdsa など) | ssh-keygen -t ed25519 |
-b <bits> | 鍵長を指定(RSA の場合 2048 以上推奨) | ssh-keygen -t rsa -b 4096 |
-f <file> | 出力ファイル名を指定 | ssh-keygen -f ~/.ssh/mykey |
-C <comment> | コメント(メールアドレスなど)を追加 | ssh-keygen -t ed25519 -C "me@example.com" |
-N <passphrase> | パスフレーズを設定 | ssh-keygen -N "mypassword" |
-y | 秘密鍵から公開鍵を出力 | ssh-keygen -y -f ~/.ssh/id_rsa |
-l | 公開鍵のフィンガープリントを表示 | ssh-keygen -l -f ~/.ssh/id_rsa.pub |
-e | OpenSSH ↔︎ RFC4716 形式に変換 | ssh-keygen -e -f id_rsa.pub |
-p | 既存の秘密鍵のパスフレーズを変更 | ssh-keygen -p -f ~/.ssh/id_rsa |
公開鍵/秘密鍵の生成以外にも、ssh‑keygen には鍵の管理や安全性向上のためのオプションが多数用意されています。よく利用されるものをまとめました。
コメントの設定・変更
鍵にメールアドレスなどのコメントを付けておくと、後からどの鍵か識別しやすくなります。新しいコメントを付けたい場合は -C オプションを使います。
# 鍵生成時にコメントを付与
ssh-keygen -t ed25519 -C "your-email@example.com"
既存の鍵のコメントを変更する場合は -c と -C を組み合わせます。パスフレーズが設定されている場合は対話的に入力を求められます。
# 既存鍵 (~/.ssh/id_ed25519) のコメントを変更
ssh-keygen -c -C "new comment" -f ~/.ssh/id_ed25519
パスフレーズの変更
既存鍵のパスフレーズを変更するには -p を使用します。対話形式で旧パスフレーズと新パスフレーズの入力を求められますが、-P と -N を指定することで非対話的に変更できます。
# 対話形式
ssh-keygen -p -f ~/.ssh/id_ed25519
# 旧パスフレーズが "oldpass"、新パスフレーズが "newpass" の場合
ssh-keygen -p -f ~/.ssh/id_ed25519 -P oldpass -N newpass
known_hosts ファイルの管理
ssh 接続先のホスト鍵は ~/.ssh/known_hosts に保存されています。鍵が増えてくると管理が大変になりがちですが、ssh‑keygen を使うと便利に操作できます。
ハッシュ化 (-H) – known_hosts 内のホスト名をハッシュ化し、漏えい時の情報暴露を防ぎます。
# known_hosts をハッシュ化し、元のファイルは .old に退避
ssh-keygen -H -f ~/.ssh/known_hosts
検索 (-F) – 指定したホスト名やホスト名:ポートが known_hosts に登録されているか検索します。
# github.com のエントリを検索し、フィンガープリントとASCIIアートも表示
ssh-keygen -F github.com -lv -f ~/.ssh/known_hosts
削除 (-R) – 特定ホストの鍵を known_hosts から削除します。ホスト名がハッシュ化されていても安全に削除できます。
# github.com のエントリを known_hosts から削除
ssh-keygen -R github.com -f ~/.ssh/known_hosts
キー形式の変換・インポート/エクスポート
OpenSSH 以外の形式を読み込んだり、他形式へエクスポートしたい場合は -i(インポート)と -e(エクスポート)を使用します。形式は -m で指定します。
# OpenSSH 形式 → RFC4716 形式に変換して出力
ssh-keygen -e -f ~/.ssh/id_ed25519 -m RFC4716
# RFC4716 形式の鍵を OpenSSH 形式に変換
ssh-keygen -i -f ./id_rsa_rfc4716 -m RFC4716 > id_rsa_openssh
フィンガープリントの表示
自分の公開鍵やサーバーの公開鍵が本物か確認したい場合は、-l でフィンガープリントを表示できます。ハッシュ方式は -E で sha256 または md5 を選択し、-v を付けるとキーを表すASCIIアートを出力します。
# sha256 形式でフィンガープリントを表示し、アスキーアートも出力
ssh-keygen -l -v -E sha256 -f ~/.ssh/id_ed25519.pub
セキュリティ強化:KDFラウンド数の指定
KDFラウンド数の指定 (-a) – 鍵を保存する際に使用する KDF のラウンド数を指定します。数値を大きくするとパスフレーズ検証が遅くなり、鍵が盗まれてもブルートフォース攻撃に耐えやすくなります。
# ラウンド数を100に設定して Ed25519 鍵を生成
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_secure
アルゴリズム選択の解説(ssh-keygen)
SSH鍵の安全性は「どの暗号アルゴリズムを選ぶか」で大きく変わります。ssh-keygen では、-t オプションで生成する鍵の種類(アルゴリズム)を指定できます。
主要なアルゴリズムの比較
| アルゴリズム | 特徴 | 利点 | 注意点 |
|---|---|---|---|
| ed25519 | 曲線暗号の一種。高い安全性と高速処理。 | 高速・強固な暗号・ファイル小さい | 古い環境だと非対応の可能性 |
| ecdsa | 曲線暗号(楕円曲線暗号)。 | ed25519に次ぐ高速性 | 曲線の選択が複雑、推奨度は低め |
| rsa | 最も一般的で互換性が高い。 | どの環境でも使える | 2048bit以上推奨 / 大きくすると鍵が重い |
アルゴリズム選択の基準
| 目的 | 選ぶべきアルゴリズム |
|---|---|
| セキュリティ・速度・最新環境 | ed25519 |
| 古い環境との互換性 | RSA(4096bit推奨) |
| 特殊機器互換 | ECDSA |
パスフレーズ設定の重要性
SSH鍵を作成する際、秘密鍵には パスフレーズを設定することが強く推奨 されます。
パスフレーズは、秘密鍵が第三者に渡ってしまった場合の「最後の防衛線」です。
パスフレーズを設定しておけば、秘密鍵を盗まれても即侵害とはならず、被害を大幅に防げます。
推奨されるのは「短いパスワード」ではなく 長いフレーズ です。10〜30文字の単語の組み合わせ(例:orange river coffee moon)が扱いやすく安全です。
パスフレーズは毎回入力する必要があるため、ssh-agentを使ってキャッシュする運用 が一般的です。
よくあるエラーと対処法
Permission denied (publickey)
公開鍵認証が失敗している状態です。以下を確認します。
- 公開鍵がGitHub・サーバーに正しく登録されているか
- 秘密鍵のパスが正しいか(
-i ~/.ssh/id_ed25519を明示する) ~/.ssh/のパーミッションが正しいか(700)- 秘密鍵のパーミッションが正しいか(600)
# 詳細ログを表示して原因を確認
ssh -vT git@github.com
WARNING: UNPROTECTED PRIVATE KEY FILE!
秘密鍵のパーミッションが広すぎる(他のユーザーから読める)場合に表示されます。
chmod 600 ~/.ssh/id_ed25519
鍵を作ったのに接続できない
- 秘密鍵と公開鍵が対になっているか確認(
ssh-keygen -y -f ~/.ssh/id_ed25519で秘密鍵から公開鍵を取り出して比較) - サーバー側の
~/.ssh/authorized_keysに公開鍵が正しく追記されているか確認 authorized_keysのパーミッションが 600 になっているか確認
GitHubでSSH接続できない
# 登録されている鍵を確認
ssh-add -l
# 接続テスト(詳細ログ付き)
ssh -vT git@github.com
ssh-add -l で “The agent has no identities.” と表示される場合は、ssh-add ~/.ssh/id_ed25519 で鍵を追加します。
よくある疑問
秘密鍵と公開鍵、どちらをGitHubに登録するのか?
公開鍵(.pub ファイル)をGitHubに登録します。秘密鍵(.pub がつかないファイル)は絶対に外部に渡しません。
.pubファイルとは何か?
.pub は「public(公開)」の略で、公開鍵ファイルです。GitHubやサーバーに登録するのはこちらです。.pub がついていないファイルが秘密鍵です。
パスフレーズを忘れたらどうする?
残念ながら、パスフレーズは復元できません。秘密鍵はパスフレーズなしでは使えなくなります。新しい鍵ペアを生成し、GitHubやサーバーに再登録する必要があります。
複数のSSH鍵を使い分けるには?
~/.ssh/config に接続先ごとの設定を記述します。
# GitHub用
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
# 会社サーバー用
Host myserver
HostName server.example.com
User deploy
IdentityFile ~/.ssh/id_ed25519_work
既存の鍵がある場合、新しく作ってよいか?
はい。ただし、保存先のファイル名を変えて作成してください(-f ~/.ssh/id_ed25519_new など)。既存の鍵を上書きすると、その鍵を使っていた接続がすべて使えなくなります。
備考
- 公開鍵は
~/.ssh/id_xxx.pub、秘密鍵は~/.ssh/id_xxxに保存される。 - GitHub/GitLab などで利用する場合、公開鍵 (
.pub) をサービスに登録する。
関連コマンド
ssh: SSH 接続を行うコマンド。ssh-copy-id: 公開鍵をリモートサーバーにコピーする。ssh-agent: 秘密鍵をキャッシュして再入力を省略する。rsyncover SSH : 生成した SSH 鍵を使ってサーバー間のファイルを安全に同期する。
参考
- manページ: https://man7.org/linux/man-pages/man1/ssh-keygen.1.html
- OpenSSH公式: https://www.openssh.com/

コメント