ssh-keygenとは?SSH鍵の作成方法とGitHub・サーバー接続での使い方

コマンドリファレンス

ssh-keygen(ssh keygen)は、SSH接続に使用する公開鍵・秘密鍵のペアを生成・管理するコマンドです。
GitHubへのプッシュやリモートサーバーへのパスワードなしログインを実現するために広く使われています。

このページでは、SSH鍵の作成手順から、GitHubへの登録・サーバーへの接続設定・権限設定・よくあるエラーまでまとめて解説します。

  1. SSH鍵とは?公開鍵と秘密鍵の違い
  2. SSH鍵の作成手順
    1. 推奨:Ed25519鍵を作成する
    2. RSA鍵を作成する(互換性が必要な場合)
    3. 実行時の対話プロンプト
    4. 保存先を指定する(-f オプション)
    5. パスフレーズとは?設定すべきか
    6. 既存の鍵を上書きしないよう注意
    7. 作成されるファイル
    8. 公開鍵の内容を確認する
  3. GitHubにSSH鍵を登録する
  4. ssh-agentに秘密鍵を追加する
  5. SSH接続テスト
  6. サーバーに公開鍵を登録する(authorized_keys)
    1. ssh-copy-idを使う(推奨)
    2. 手動で追加する
  7. 権限設定(パーミッション)
  8. 構文(Syntax)
  9. ssh-keygen の主なオプション一覧
    1. コメントの設定・変更
    2. パスフレーズの変更
    3. known_hosts ファイルの管理
    4. キー形式の変換・インポート/エクスポート
    5. フィンガープリントの表示
    6. セキュリティ強化:KDFラウンド数の指定
  10. アルゴリズム選択の解説(ssh-keygen)
    1. 主要なアルゴリズムの比較
    2. アルゴリズム選択の基準
  11. パスフレーズ設定の重要性
  12. よくあるエラーと対処法
    1. Permission denied (publickey)
    2. WARNING: UNPROTECTED PRIVATE KEY FILE!
    3. 鍵を作ったのに接続できない
    4. GitHubでSSH接続できない
  13. よくある疑問
    1. 秘密鍵と公開鍵、どちらをGitHubに登録するのか?
    2. .pubファイルとは何か?
    3. パスフレーズを忘れたらどうする?
    4. 複数のSSH鍵を使い分けるには?
    5. 既存の鍵がある場合、新しく作ってよいか?
  14. ~/.ssh/config で複数のSSH鍵を管理する
    1. config ファイルの基本書式
    2. 設定例:GitHub・会社サーバー・個人サーバーを使い分ける
    3. config 設定後の接続方法
    4. config ファイルのパーミッション
    5. 共通設定をまとめる(Host *)
  15. 備考
  16. 関連コマンド
  17. 参考
  18. 関連記事

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ができるようになります。

  1. 公開鍵の内容をコピーする
cat ~/.ssh/id_ed25519.pub
# 表示された文字列をすべてコピー
  1. GitHubの設定ページを開く

GitHub → Settings → SSH and GPG keys → New SSH key

  1. タイトルを入力し、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/700chmod 700 ~/.ssh
秘密鍵(例: id_ed25519600chmod 600 ~/.ssh/id_ed25519
公開鍵(例: id_ed25519.pub644chmod 644 ~/.ssh/id_ed25519.pub
authorized_keys(サーバー側)600chmod 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_rsassh-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
-eOpenSSH ↔︎ 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 でフィンガープリントを表示できます。ハッシュ方式は -Esha256 または 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/config で複数のSSH鍵を管理する

GitHubと会社のサーバー、個人サーバーなど複数の接続先で異なるSSH鍵を使う場合、~/.ssh/config に設定を書いておくと管理が楽になります。

config ファイルの基本書式

Host <エイリアス>
  HostName <実際のホスト名またはIPアドレス>
  User <ログインユーザー名>
  IdentityFile <秘密鍵のパス>
  Port <ポート番号(省略時は22)>

設定例:GitHub・会社サーバー・個人サーバーを使い分ける

# ~/.ssh/config

# GitHub用(個人アカウント)
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github

# GitHub用(会社アカウント)
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_work

# 会社のサーバー
Host myserver
  HostName server.example.com
  User deploy
  IdentityFile ~/.ssh/id_ed25519_work
  Port 22

# 自宅サーバー(非標準ポート)
Host homeserver
  HostName 192.168.1.100
  User alice
  IdentityFile ~/.ssh/id_ed25519_home
  Port 2222

config 設定後の接続方法

設定後は Host に指定したエイリアス名で接続できます。

# エイリアスで接続(実際のIPやユーザー名を覚えなくてよい)
ssh myserver       # server.example.com に deploy ユーザーで接続
ssh homeserver     # 192.168.1.100:2222 に alice ユーザーで接続

# GitHubで会社アカウントのリポジトリをcloneする場合
git clone git@github-work:company/repo.git

config ファイルのパーミッション

chmod 600 ~/.ssh/config   # 自分だけ読み書き可能にする(必須)

config ファイルのパーミッションが緩すぎると、SSHが警告を出して接続を拒否することがあります。必ず 600 に設定してください。詳しくは chmod コマンドの使い方 を参照してください。

共通設定をまとめる(Host *)

# すべての接続に適用するデフォルト設定
Host *
  AddKeysToAgent yes      # ssh-agent に自動追加
  IdentitiesOnly yes      # IdentityFile で指定した鍵のみ使う
  ServerAliveInterval 60  # 接続維持(タイムアウト対策)

備考

  • 公開鍵は ~/.ssh/id_xxx.pub、秘密鍵は ~/.ssh/id_xxx に保存される。
  • GitHub/GitLab などで利用する場合、公開鍵 (.pub) をサービスに登録する。

関連コマンド

  • ssh : SSH 接続を行うコマンド。
  • ssh-copy-id : 公開鍵をリモートサーバーにコピーする。
  • ssh-agent : 秘密鍵をキャッシュして再入力を省略する。
  • rsync over SSH : 生成した SSH 鍵を使ってサーバー間のファイルを安全に同期する。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント