公開鍵認証はセキュリティ面でもパスワード認証より格段に強固で、現場のLinuxサーバーではほぼ標準の設定です。
この記事では、
ssh-keygen コマンドで鍵ペアを生成する基本手順から、サーバーへの公開鍵登録(authorized_keys)、パスフレーズの扱い、よくあるエラーの対処まで、実務で使えるレベルで解説します。動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS / Rocky Linux 9.3
この記事のポイント
・ssh-keygen -t ed25519 で最新推奨アルゴリズムの鍵ペアを生成できる
・公開鍵は ssh-copy-id またはauthorized_keysに手動追記で登録する
・パーミッション設定(700/600)が間違うとPermission deniedになる
・パスフレーズ+ssh-agentで安全性と利便性を両立できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SSH公開鍵認証の仕組みを理解する
公開鍵認証は「秘密鍵を持っている本人かどうか」を数学的に検証するしくみです。パスワード認証と違い、パスワード文字列がネットワーク上を流れないため、盗聴やブルートフォース攻撃のリスクを大幅に下げられます。
鍵は必ずペアで生成されます。
・秘密鍵(private key):自分のPCに保管。絶対に外部に出さない
・公開鍵(public key):接続先サーバーに登録する。漏れても問題ない
接続時の流れはおおまかに以下の通りです。
1. クライアントが「公開鍵でこの乱数を暗号化してください」とサーバーに要求する
2. サーバーは登録済みの公開鍵で乱数を暗号化してクライアントに送り返す
3. クライアントは秘密鍵で復号して元の乱数と一致することを確認する
4. 一致すれば認証成功
秘密鍵を持っている本人しかこの検証をパスできないため、パスワードなしでも安全に接続できます。
ssh-keygenの基本的な使い方
1. 鍵ペアを生成する
ssh-keygen コマンドで鍵ペアを生成します。アルゴリズムには
ed25519 を指定するのが現在の推奨です(RSA-4096も可ですが、ed25519はより短い鍵長で同等以上の安全性を持ちます)。# ed25519アルゴリズムで鍵ペアを生成する(推奨) $ ssh-keygen -t ed25519 -C "your_email@example.com" 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: Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub The key fingerprint is: SHA256:xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX your_email@example.com
-C オプションはコメントです。メールアドレスや用途を書いておくと複数鍵を管理するときに識別しやすくなります。パスフレーズを設定すると秘密鍵が盗まれても即時悪用されるリスクを下げられます(パスフレーズなしにする場合はそのままEnterを2回押します)。
2. 生成された鍵ファイルを確認する
# ~/.ssh/ ディレクトリを確認する $ ls -la ~/.ssh/ total 16 drwx------. 2 user user 4096 Apr 13 09:30 . drwx------. 7 user user 4096 Apr 13 09:30 .. -rw-------. 1 user user 411 Apr 13 09:30 id_ed25519 ← 秘密鍵(パーミッション600必須) -rw-r--r--. 1 user user 97 Apr 13 09:30 id_ed25519.pub ← 公開鍵(.pub付き)
600(所有者のみ読み書き可)になっていることを確認してください。他のユーザーが読み書きできる状態だとSSHクライアントが「Permissions too open」エラーを出して接続を拒否します。
3. RSA鍵を生成する場合(互換性が必要な場合)
古いサーバーへの接続など、ed25519が使えない環境では-t rsa -b 4096 でRSA 4096bit鍵を生成します。# RSA 4096bit鍵を生成する(旧環境との互換性が必要な場合) $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
公開鍵をサーバーに登録する
1. ssh-copy-idで自動登録する(推奨)
ssh-copy-id コマンドを使うと、公開鍵のコピーとサーバー側のパーミッション設定を自動で行えます。# ssh-copy-idで公開鍵をサーバーに登録する $ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.100 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s) /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new key(s) user@192.168.1.100's password: ← この1回だけパスワードが必要 Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@192.168.1.100'"
ssh user@192.168.1.100 だけでパスワードなしで接続できます(パスフレーズを設定した場合はパスフレーズの入力が必要です)。2. 手動でauthorized_keysに追記する
ssh-copy-id が使えない環境では、公開鍵の内容をサーバーの ~/.ssh/authorized_keys に手動で追記します。# クライアント側で公開鍵の内容を確認する $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxx... your_email@example.com # サーバー側で ~/.ssh/authorized_keys に追記する $ mkdir -p ~/.ssh $ echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxx... your_email@example.com" >> ~/.ssh/authorized_keys # パーミッションを設定する(重要) $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
※注意:
authorized_keys には既存の公開鍵が入っている場合があります。>(上書き)ではなく >>(追記)を使わないと、既存の鍵が消えてロックアウトされる危険があります。3. 接続確認する
# 公開鍵認証で接続できることを確認する $ ssh user@192.168.1.100 Enter passphrase for key '/home/user/.ssh/id_ed25519': ← パスフレーズを設定した場合のみ表示 Last login: Sun Apr 13 09:30:00 2026 from 192.168.1.1 [user@server ~]$
ssh-agentでパスフレーズ入力を省略する
パスフレーズを設定すると接続のたびにパスフレーズ入力が必要になります。ssh-agent を使うと、1回入力するだけでセッション中はパスフレーズを記憶させられます。# ssh-agentを起動して秘密鍵を登録する $ eval "$(ssh-agent -s)" Agent pid 12345 $ ssh-add ~/.ssh/id_ed25519 Enter passphrase for /home/user/.ssh/id_ed25519: ← この1回だけ入力する Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com) # 登録済みの鍵を確認する $ ssh-add -l 256 SHA256:xXxXxXxXxXxXxXxX your_email@example.com (ED25519)
デスクトップ環境(GNOME等)では自動的にssh-agentが動いているため
ssh-add だけで済む場合もあります。複数の鍵を用途別に管理する(~/.ssh/config)
サーバーごとに異なる鍵ファイルを使いたい場合は~/.ssh/config にホスト定義を書きます。# ~/.ssh/config の設定例 Host web-server HostName 203.0.113.10 User ec2-user IdentityFile ~/.ssh/id_ed25519_webserver Host db-server HostName 203.0.113.20 User dbadmin IdentityFile ~/.ssh/id_rsa_legacy Port 22022
ssh web-server だけで接続できます。鍵ファイルのパスや接続先ホスト名を毎回打ち込む必要がなくなり、作業ミスも減ります。
「Permission denied (publickey)」が出た時の対処法
公開鍵認証を設定したのにPermission denied (publickey) が出るケースで最も多い原因はパーミッションの誤設定です。1. クライアント側のパーミッションを確認する
# 秘密鍵のパーミッションを確認する(600でなければ修正) $ ls -la ~/.ssh/id_ed25519 -rw-------. 1 user user 411 Apr 13 09:30 /home/user/.ssh/id_ed25519 # 権限が緩い場合は修正する $ chmod 600 ~/.ssh/id_ed25519 $ chmod 700 ~/.ssh
2. サーバー側のパーミッションを確認する
# サーバー側で確認する(SSHでログインできる場合) $ ls -la ~/.ssh/ drwx------. 2 user user 4096 Apr 13 09:30 . -rw-------. 1 user user 411 Apr 13 09:30 authorized_keys ← 600必須 $ ls -la ~ | grep .ssh drwx------. 2 user user 4096 Apr 13 09:30 .ssh ← 700必須
3. sshd_configで公開鍵認証が有効か確認する
# /etc/ssh/sshd_config の設定を確認する $ sudo grep -E "PubkeyAuthentication|AuthorizedKeysFile" /etc/ssh/sshd_config PubkeyAuthentication yes ← yesになっていること AuthorizedKeysFile .ssh/authorized_keys ← 標準パス
4. 詳細ログで原因を特定する
-v オプションを付けると接続の詳細ログが出ます。-vvv でさらに詳しく確認できます。# -vで詳細ログを出力して原因を特定する $ ssh -v user@192.168.1.100 ... debug1: Trying private key: /home/user/.ssh/id_ed25519 debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic debug1: No more authentication methods to try. user@192.168.1.100: Permission denied (publickey).
Trying private key」の行で鍵ファイルのパスを確認し、「Authentications that can continue」で許可されている認証方式を確認します。本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ed25519鍵ペアを生成する | ssh-keygen -t ed25519 -C "コメント" |
| RSA鍵ペアを生成する(旧環境向け) | ssh-keygen -t rsa -b 4096 -C "コメント" |
| 公開鍵をサーバーに自動登録する | ssh-copy-id -i ~/.ssh/id_ed25519.pub user@ホスト名 |
| authorized_keysに手動追記する | echo "公開鍵の内容" >> ~/.ssh/authorized_keys |
| ssh-agentに秘密鍵を登録する | ssh-add ~/.ssh/id_ed25519 |
| 登録済みの鍵を確認する | ssh-add -l |
| 接続詳細ログを表示する | ssh -v user@ホスト名 |
特にサーバーを複数管理するエンジニアにとっては欠かせない設定です。
SSH接続の基本的なコマンドや接続オプションについては、sshコマンドでLinuxサーバーにリモート接続する方法も合わせて参照してください。
また、SSHのセキュリティ強化としてポート番号変更やパスワード認証の無効化については、SSHのポート番号を変更する方法|sshd_configの設定からfirewalld・SELinux対応まででも解説しています。
SSH設定が整ったら、次はサーバー構築の基礎を体系的に学びませんか?
公開鍵認証をマスターするとサーバー管理が格段にラクになります。その力を活かして、体系的にLinuxサーバー構築を学んでみませんか。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
