SSHでサーバーに接続するとき、毎回パスワードを入力するのは面倒ですし、総当たり攻撃のリスクもあります。そこで使うのが公開鍵認証です。秘密鍵(手元に厳重保管)と公開鍵(サーバーに登録)のペアを使い、パスワードなしで安全にログインできるようにします。鍵ペアを作るコマンドがssh-keygenです。
つまずきやすいのは、秘密鍵・公開鍵のどちらをサーバーに置くのか(置くのは公開鍵)と、秘密鍵の権限(パーミッション)が緩いとSSHが鍵を拒否することです。この記事では、実機(WindowsのOpenSSHとLinux)で鍵を作りながら、公開鍵認証の設定を最初から最後まで整理します。エックスサーバーなどのレンタルサーバーやVPSにも、同じ手順で適用できます。
- 鍵ペアは
ssh-keygen -t ed25519で作ります(現在の推奨方式)。 - 秘密鍵(
id_ed25519)は手元・公開鍵(id_ed25519.pub)をサーバーへ置きます。 - 公開鍵はサーバーの
~/.ssh/authorized_keysに追記します。 - 秘密鍵の権限は600(自分だけ読み書き)。緩いとSSHが鍵を無視します。
~/.sshは700、authorized_keysは600が必要です。- パスフレーズを設定すると、秘密鍵が盗まれても即座には悪用されません。
鍵で接続したあとの操作はSSHでリモートサーバーに接続してファイルを編集する方法、ファイル転送はscpコマンド、権限の考え方はchmodとパーミッションもあわせて参考になります。
鍵ペアを作る(ssh-keygen)
まず手元のPCで鍵ペアを作ります。方式は、現在もっとも推奨されるed25519を使います(短くて安全で高速)。-Cはコメント(どの鍵か分かるように、メールアドレスや用途を入れるのが慣例)です。
# ed25519 方式で鍵ペアを作成 ssh-keygen -t ed25519 -C "your_email@example.com" # 対話で3つ聞かれる: # Enter file ... → 保存先(Enterで既定 ~/.ssh/id_ed25519) # Enter passphrase → パスフレーズ(後述・空でも可) # Enter same passphrase → 確認 # 完成する2つのファイル: # ~/.ssh/id_ed25519 … 秘密鍵(絶対に渡さない) # ~/.ssh/id_ed25519.pub … 公開鍵(サーバーに登録する)
実機で作成したところ、拡張子なしの秘密鍵と.pubが付いた公開鍵の2ファイルができました。秘密鍵の中身は-----BEGIN OPENSSH PRIVATE KEY-----で始まるテキスト、公開鍵はssh-ed25519 AAAAC3Nza... コメントという1行です。この2つの役割を取り違えないことが最重要で、サーバーに登録するのは.pub(公開鍵)だけ、秘密鍵は手元から絶対に出しません。なお、古い環境でed25519が使えない場合はssh-keygen -t rsa -b 4096(RSA 4096ビット)を使います(実機でも生成を確認しました)。
【最重要】秘密鍵の権限は600
公開鍵認証で必ず知っておくべきなのが秘密鍵のパーミッションです。秘密鍵が「自分以外にも読める」状態だと、SSHはセキュリティ上の理由でその鍵を拒否します。ssh-keygenは最初から正しい権限で作ってくれますが、コピーや移動で崩れることがあります。
# ssh-keygen が作る既定の権限(確認) ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub # -rw------- id_ed25519 ← 秘密鍵は 600(自分だけ) # -rw-r--r-- id_ed25519.pub ← 公開鍵は 644(誰でも読めてよい) # もし権限が緩い(644など)と、鍵を使う時にこう怒られる: # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ # Permissions 0644 for 'id_ed25519' are too open. # It is required that your private key files are NOT accessible by others. # This private key will be ignored. # 直し方: 600 に設定する chmod 600 ~/.ssh/id_ed25519
実機でssh-keygenが作った鍵の権限を確認したところ、秘密鍵は-rw-------(600・自分だけ読み書き)、公開鍵は-rw-r--r--(644・誰でも読める)と、最初から適切に設定されていました。これは偶然ではなく、SSHは秘密鍵がグループや他人に読める状態だと、その鍵の使用を拒否する仕様だからです。実際に秘密鍵をchmod 644に緩めて鍵を読ませたところ、WARNING: UNPROTECTED PRIVATE KEY FILE! / Permissions 0644 for '鍵' are too open. / This private key will be ignored.と表示され、鍵が無視されることを確認しました。chmod 600に戻すと警告は消えます。秘密鍵はパスワードと同じで、他人に読まれた時点で意味を失うためです。Windowsから鍵をコピーしたり、scpで移したりすると権限が崩れることがあるので、「鍵を使おうとしたら弾かれる」ときは、まずchmod 600で秘密鍵の権限を確認してください。あわせて~/.sshディレクトリは700である必要もあります。
公開鍵をサーバーに登録する(authorized_keys)
公開鍵認証の設定は、公開鍵をサーバーの~/.ssh/authorized_keysに追記するだけです。もっとも簡単なのはssh-copy-idコマンドですが、使えない環境では手動でも登録できます。
# 方法1: ssh-copy-id(一番かんたん・自動で権限も設定) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@example.com # 方法2: 手動(ssh-copy-id が無い / ポートが特殊なとき) # サーバーにログインしてから: mkdir -p ~/.ssh chmod 700 ~/.ssh # 公開鍵の中身(1行)を authorized_keys に追記 echo "ssh-ed25519 AAAAC3Nza... コメント" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
実機(Linux)で登録手順を再現したところ、~/.sshを700、authorized_keysを600にして公開鍵を追記する、という形が正しく作れました。このサーバー側の権限も緩いとSSHが認証を拒否します(誰でも書き換えられるauthorized_keysは信用できないためです)。公開鍵は1鍵につき1行で、複数のPCから接続したいときはauthorized_keysに行を追加していくだけです(追記なので上書きの>ではなく追記の>>を使う点に注意)。ssh-copy-idを使えば、これらの権限設定まで自動でやってくれるので確実です。
接続と、うまくいかないときの確認
登録できたら、秘密鍵を指定して接続します。鍵が既定の場所(~/.ssh/id_ed25519)にあれば-iは省略できます。
# 秘密鍵を指定して接続(ポートが22以外なら -p も) ssh -i ~/.ssh/id_ed25519 -p 10022 user@example.com # 鍵が既定の場所なら -i は省略可 ssh -p 10022 user@example.com # うまくいかないときは -v で詳細ログを見る ssh -v -i ~/.ssh/id_ed25519 user@example.com # offering public key / Server accepts key などの行で # 鍵が試されているか・受け入れられたかが分かる
公開鍵認証がうまくいかないときの原因は、ほぼ権限(秘密鍵600・~/.ssh700・authorized_keys600)か、登録した公開鍵の貼り間違い(改行が混入して2行になっている等)のどちらかです。ssh -v(詳細モード)で接続すると、どの鍵を試して何が起きたかが表示されるので、切り分けに役立ちます。パスワード認証を残しているサーバーなら、失敗しても従来どおりパスワードでログインできるので、まず接続を確認してから鍵認証に移行すると安全です。
パスフレーズと鍵の管理
鍵作成時に聞かれるパスフレーズは、秘密鍵ファイル自体にかけるパスワードです。空にもできますが、設定しておくと万一秘密鍵が盗まれても、パスフレーズがなければ即座には使われません。毎回の入力はssh-agentで省けます。
# パスフレーズ付きで鍵を作る(作成時に入力) ssh-keygen -t ed25519 -C "work-laptop" # 既存鍵のパスフレーズを後から変更・設定 ssh-keygen -p -f ~/.ssh/id_ed25519 # 公開鍵の指紋(フィンガープリント)を確認 ssh-keygen -lf ~/.ssh/id_ed25519.pub # 256 SHA256:xxxx... コメント (ED25519) # 公開鍵を紛失しても、秘密鍵から作り直せる ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
実機でも、パスフレーズ付きの鍵の生成、-lfでの指紋(SHA256)表示、そして-yで秘密鍵から公開鍵を再生成できること(元の公開鍵と一致)を確認しました。とくにssh-keygen -yは、「公開鍵ファイルを消してしまったが秘密鍵はある」というときの復旧に役立ちます。パスフレーズは、ノートPCなど盗難・紛失のリスクがある端末では設定しておくのが安全です。毎回の入力が面倒なら、ssh-agentにいったん登録すれば、セッション中は再入力せずに済みます。
主なコマンド・要点一覧
公開鍵認証の要点をまとめます。
| 項目 | 内容 |
|---|---|
ssh-keygen -t ed25519 |
鍵ペアの作成(推奨方式) |
| 秘密鍵 / 公開鍵 | id_ed25519(手元)/ .pub(サーバーへ) |
ssh-copy-id |
公開鍵をサーバーに登録(権限も自動) |
| 秘密鍵=600 / .ssh=700 / authorized_keys=600 | これより緩いとSSHが拒否 |
ssh-keygen -lf 公開鍵 |
指紋(フィンガープリント)確認 |
ssh-keygen -y -f 秘密鍵 |
秘密鍵から公開鍵を再生成 |
よくある失敗
秘密鍵をサーバーに置いてしまう
サーバーに登録するのは公開鍵(.pub)です。秘密鍵は手元から出しません。
秘密鍵の権限が緩くて弾かれる
UNPROTECTED警告が出たらchmod 600 秘密鍵。~/.sshは700です。
公開鍵を貼るとき改行が混入する
公開鍵は1行です。コピペで折り返して2行になると認証に失敗します。
authorized_keysを>で上書きする
複数鍵は追記です。>>を使わないと既存の鍵が消えます。
いきなりパスワード認証を無効化する
鍵接続を確認する前に無効化するとロックアウトの危険があります。接続確認後に無効化します。
よくある質問
.pubが付くほう)を登録します。サーバーの~/.ssh/authorized_keysに追記します。秘密鍵は手元のPCに厳重に保管し、絶対に他人に渡さず、サーバーにも置きません。名前を取り違えると認証できないので注意してください。ed25519が推奨です。短く・安全で・高速です。ssh-keygen -t ed25519で作成します。古くてed25519に対応していないサーバー向けにはssh-keygen -t rsa -b 4096(RSA 4096ビット)を使います。どちらも実機で生成を確認しています。Permissions 0644 ... are too openと警告してその鍵を無視する仕様です(実機でも644で警告が出て、600に戻すと消えることを確認しています)。chmod 600 ~/.ssh/id_ed25519で権限を600(自分だけ読み書き)に設定してください。あわせて~/.sshディレクトリを700にする必要もあります。ssh-agentに登録すれば、セッション中は再入力が不要です。後からssh-keygen -pで設定・変更もできます。ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pubで、秘密鍵から公開鍵を再生成できます。実機でも、再生成した公開鍵が元と一致することを確認しています。逆に、秘密鍵を失った場合は復元できないため、鍵ペアを作り直してサーバーに登録し直すことになります。まとめ
- 鍵ペアは
ssh-keygen -t ed25519。秘密鍵は手元、公開鍵をサーバーへ。 - 公開鍵は
~/.ssh/authorized_keysに追記(ssh-copy-idが簡単)。 - 権限が命:秘密鍵600・
~/.ssh700・authorized_keys600。 - うまくいかないときは
ssh -vで切り分け。原因は権限か貼り間違いがほとんど。 - パスフレーズで秘密鍵を保護、
ssh-keygen -yで公開鍵を再生成できます。
公開鍵認証は、SSHを安全かつ快適に使うための土台です。「登録するのは公開鍵」「権限は600・700」という2点さえ押さえれば、設定でつまずくことはほとんどありません。鍵認証を用意したら、次はパスワード認証の無効化やポート番号の変更で、サーバーのセキュリティをさらに高めていきましょう。

