できない.dev

SSH で「UNPROTECTED PRIVATE KEY FILE」が出て鍵が使えない

秘密鍵ファイルが本人以外から読める権限になっていると、OpenSSH はその鍵を無視して接続を拒否する。chmod 600 で本人だけが読み書きできる状態にすれば解消する。~/.ssh 自体の権限も同時に見直す。

公開:

要約

OpenSSH は、秘密鍵が本人以外から読める状態なら鍵ごと無視する
鍵の内容やサーバー側の設定は関係なく、ローカルのファイル権限だけが原因である。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

最後の 1 行が本質で、鍵が使われないまま認証に進むため、続けて Permission denied (publickey) になることが多い。ssh(1) は秘密鍵について「本人が読めるだけで、他者からはアクセスできない状態であるべき」と定めている。

よくある原因

  1. 権限が緩い: 06440664 が典型。git clone した設定リポジトリから鍵を展開した、cp でコピーしたといった場面で起きる。
  2. ~/.ssh 自体が緩い: 鍵の権限が正しくても、ディレクトリが他人から書き込める状態だと拒否されることがある。
  3. WSL から Windows 側の鍵を使っている: /mnt/c 配下は既定で 0777 相当に見えるため、chmod しても保持されない場合がある。
  4. 所有者が違う: sudo を付けて操作した結果、root 所有のまま残っている。

解決策

1. 権限を絞る

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
ls -l ~/.ssh

秘密鍵は 600-rw-------)、ディレクトリは 700drwx------)が基準である。
公開鍵と known_hosts は他者から読めても問題ない。

2. 所有者を直す

chown "$USER:$USER" ~/.ssh ~/.ssh/id_ed25519

ls -l の所有者が自分でなければ、権限を変える前にこれを行う。

3. WSL では Linux 側に鍵を置く

cp /mnt/c/Users/you/.ssh/id_ed25519 ~/.ssh/
chmod 600 ~/.ssh/id_ed25519

/mnt/c 配下のまま使うと、chmod しても再マウントで権限が戻り、同じエラーを繰り返す。
Linux 側のホームへコピーしてから権限を設定するのが確実である。
コピー元の鍵が不要になったら消しておく。

4. 直ったかを確認する

ssh -T git@github.com

警告が出なくなり、鍵が読み込まれていれば次の段階(認証の成否)へ進む。ssh -v を付けると、どの鍵ファイルを試したかが行単位で出るので切り分けに使える。

この記事は役立ちましたか?