ssh-keygen – SSH 鍵を生成・管理するコマンド

リモートアクセス

ssh-keygen コマンドは、SSH 接続に利用する公開鍵・秘密鍵ペアを生成・管理するためのコマンドです。
パスワードなしのログインや、GitHub/GitLab などのサービス認証に広く使われます。

構文(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

サイレント/詳細モード

自動化されたスクリプトで実行する際は、不要なプロンプトや出力を抑えたい場合があります。-q を指定すると ssh‑keygen の出力が抑制されます。逆に詳細な情報が必要な場合は -v を指定し、-l などと併用します。

# 出力を抑えて RSA 鍵を生成
ssh-keygen -q -t rsa -b 4096 -f ~/.ssh/id_rsa

セキュリティ強化関連のオプション

KDFラウンド数の指定 (-a) – 鍵を保存する際に使用する KDF のラウンド数を指定します。数値を大きくするとパスフレーズ検証が遅くなり、鍵が盗まれてもブルートフォース攻撃に耐えやすくなります。

# ラウンド数を100に設定して Ed25519 鍵を生成
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_secure

バブルバブルダイジェスト表示 (-B) – 鍵のハッシュを人間が読みやすい形式で表示します。

ssh-keygen -B -f ~/.ssh/id_ed25519.pub

FIDO 認証器・SSHFPレコード・モジュラス生成

  • FIDO 認証器の鍵を利用 (-K-O) – ハードウェアトークンからレジデントキーをダウンロードしたり、生成時のオプションを指定する際に使用します。YubiKey 等を利用する場合は便利です。
  • DNS 用 SSHFP レコードの生成 (-r) – 公開鍵からDNS用の SSHFP レコードを生成し、DNSSEC 環境で鍵を配布する際に使います。
  • Diffie‑Hellman グループ交換のパラメータ生成 (-M generate/-M screen) – サーバー運用者向けにDHパラメータの生成・検証を行うオプションです。一般的なSSHユーザーは使用しませんが、サーバー管理者が安全なグループパラメータを用意する際に参考になります。

実行例

新しい RSA 鍵を作成

ssh-keygen -t rsa -b 4096 -C "me@example.com"

出力例(対話式):

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

Ed25519 鍵を作成(推奨)

ssh-keygen -t ed25519 -C "me@example.com"

出力ファイル名を指定して作成

ssh-keygen -t rsa -b 2048 -f ~/.ssh/mykey

秘密鍵から公開鍵を出力

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

公開鍵のフィンガープリントを確認

ssh-keygen -l -f ~/.ssh/id_rsa.pub

出力例:

4096 SHA256:abcd1234... me@example.com (RSA)

秘密鍵のパスフレーズを変更

ssh-keygen -p -f ~/.ssh/id_rsa

エラー例(存在しない鍵ファイル)

ssh-keygen -y -f ~/.ssh/notfound

出力例:

load failed

パスフレーズ設定の重要性

SSH鍵を作成する際、秘密鍵には パスフレーズを設定することが強く推奨 されます。
パスフレーズは、秘密鍵が第三者に渡ってしまった場合の「最後の防衛線」です。

秘密鍵が盗まれた場合のリスク軽減

SSH公開鍵認証は非常に安全ですが、秘密鍵ファイルそのものを奪われると話は別です。

  • PC盗難
  • バックアップからの漏えい
  • メール等への誤送信
  • 誤ってGitHubにコミット
  • 共有サーバーでのファイル権限設定ミス

これらの状況で秘密鍵が流出すると、攻撃者はパスフレーズが無ければ そのままサーバーにログイン可能 になります。

パスフレーズを設定しておけば、秘密鍵を盗まれても即侵害とはならず、被害を大幅に防げます。

ブルートフォース耐性を高める

OpenSSH では、パスフレーズは bcrypt などの強力な KDF(鍵導出関数)で処理されます。

そのため、パスフレーズが適切であれば、攻撃者が総当たり攻撃で突破するのは現実的に困難です。

ゼロトラスト化・コンプライアンスの観点でも必須

企業やチームでの運用では、秘密鍵の管理が緩いと重大な情報漏えいにつながります。

  • 監査ログ
  • セキュリティ基準
  • アクセス管理ポリシー

これらの観点でも、パスフレーズ設定は標準で求められる対策です。

どんなパスフレーズが良いのか

推奨されるのは「短いパスワード」ではなく 長いフレーズ です。

  • 10〜30文字
  • 単語の組み合わせ(例:orange river coffee moon
  • 記号・数字も加えるとさらに強力

パスフレーズは毎回入力する必要があるため、
ssh-agentを使ってキャッシュする運用 が一般的です。

パスフレーズの重要性 – まとめ

  • 秘密鍵が盗まれたときの“最後の砦”になる
  • 総当たり攻撃への強度が高い
  • 企業利用やチーム運用では必須レベル
  • 長文のフレーズ形式が最も安全で実用的

SSH鍵そのものの安全性を最大限に高めるために、
パスフレーズの設定は必ず行うべき基本対策 です。

アルゴリズム選択の解説(ssh-keygen)

SSH鍵の安全性は「どの暗号アルゴリズムを選ぶか」で大きく変わります。
ssh-keygen では、-t オプションで生成する鍵の種類(アルゴリズム)を指定できます。

主要なアルゴリズムの比較

SSHで一般的に使われるアルゴリズムは以下の4種類です。

アルゴリズム特徴利点注意点
ed25519曲線暗号の一種。高い安全性と高速処理。高速・強固な暗号・ファイル小さい古い環境だと非対応の可能性
ecdsa曲線暗号(楕円曲線暗号)。ed25519に次ぐ高速性曲線の選択が複雑、推奨度は低め
rsa最も一般的で互換性が高い。どの環境でも使える2048bit以上推奨 / 大きくすると鍵が重い
rsa-sha2-256/512RSA + SHA2署名。SHA1問題への対策として安全性向上RSA同様、鍵サイズは大きめ

どのアルゴリズムを選べば良い?

結論:特に理由がなければ「ed25519」を使う

ed25519 のメリット

  • 鍵が小さく扱いやすい
  • 非常に高速
  • セキュリティレベルが高い
  • パスフレーズによる保護との相性も良い

現行のOpenSSHでは 最も推奨される鍵種 です。

互換性を重視する場合は RSA

一部の古い環境、特殊なネットワーク機器では ed25519 が使えないことがあります。

その場合は RSA(最低2048bit、推奨4096bit) を使います。

ssh-keygen -t rsa -b 4096 -C "your@mail.com"

ECDSA は基本的に選ばなくてOK

ECDSA も実務ではまだ使われていますが、

  • 曲線選択の複雑さ
  • 過去の実装上の問題
  • ed25519の優位性

などから、新規で選ぶ理由はあまりありません。

ssh-keygen -t ecdsa -b 521

※特定機器との互換性のために選ばざるを得ないケースのみ。

各アルゴリズムのコマンド例

ed25519(推奨)

ssh-keygen -t ed25519 -C "example@mail.com"

RSA(互換性重視)

ssh-keygen -t rsa -b 4096 -C "example@mail.com"

ECDSA

ssh-keygen -t ecdsa -b 521 -C "example@mail.com"

アルゴリズム選択の基準

目的選ぶべきアルゴリズム
セキュリティ・速度・最新環境ed25519
古い環境との互換性RSA(4096bit推奨)
特殊機器互換ECDSA

SSH鍵の安全性は適切なアルゴリズム選択から始まります。用途に応じて最適な鍵種を選び、安全なアクセス環境を構築しましょう。

備考

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

関連コマンド

  • ssh : SSH 接続を行うコマンド。
  • ssh-copy-id : 公開鍵をリモートサーバーにコピーする。
  • ssh-agent : 秘密鍵をキャッシュして再入力を省略する。

参考

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント