SSH で「Permission denied (publickey)」が出て接続できない
鍵は作ったのに publickey で蹴られるのは、サーバー側が公開鍵を見つけられていないか、パーミッションが緩くて採用を拒否しているかのどちらかである。
ユーザー名・鍵の対応・authorized_keys の権限を順に切り分ける。
公開: 更新:
要約
Permission denied (publickey). は「公開鍵認証だけが許可されていて、その公開鍵認証に失敗した」という意味である。
パスワードを聞かれずに即座に蹴られるため設定が丸ごと無視されたように見えるが、実際にはサーバーが鍵を受け付けなかっただけである。
原因は大きく 2 つしかない。
サーバー側が該当ユーザーの authorized_keys に手元の公開鍵を見つけられていないか、見つけたが権限が緩いので採用を拒否したかである。
切り分けは ssh -v の出力から始める。
$ ssh -v user@example.com
debug1: Offering public key: /home/me/.ssh/id_ed25519 ED25519 SHA256:xxxx
debug1: Authentications that can continue: publickey
Permission denied (publickey).Offering public key が 1 行も出ていなければ手元の問題、出ているのに蹴られていればサーバー側の問題である。
実行例
公開鍵を登録していない deploy に繋ぐと Permission denied (publickey) で終了コード 255 になり、-v の出力では Offering public key で鍵を提示したあとも Authentications that can continue: publickey が続いていた。authorized_keys を置いても ~/.ssh が 777・authorized_keys が 666 のままでは同じエラーになり、700 と 600 に直すと whoami が deploy を返し、ユーザー名を ubuntu に変えると再び拒否されている。
$ ssh -p 2222 deploy@127.0.0.1 whoami
deploy@127.0.0.1: Permission denied (publickey).
$ echo $?
255$ ssh -v -p 2222 deploy@127.0.0.1 whoami 2>&1 | grep -E "Offering|Authentications|Server accepts"
debug1: Authentications that can continue: publickey
debug1: Offering public key: /root/.ssh/id_ed25519 ED25519 SHA256:n+NjlsLlXjJdNs9j925V6zvTnGIqix+UfShw/4zZg1s
debug1: Authentications that can continue: publickey$ ls -ld /home/deploy/.ssh /home/deploy/.ssh/authorized_keys
drwxrwxrwx 2 deploy deploy 4096 Sep 26 02:07 /home/deploy/.ssh
-rw-rw-rw- 1 deploy deploy 99 Sep 26 02:07 /home/deploy/.ssh/authorized_keys$ ssh -p 2222 deploy@127.0.0.1 whoami
deploy@127.0.0.1: Permission denied (publickey).
$ echo $?
255$ chmod 700 /home/deploy/.ssh$ chmod 600 /home/deploy/.ssh/authorized_keys$ ssh -p 2222 deploy@127.0.0.1 whoami
deploy
$ echo $?
0$ ssh -p 2222 ubuntu@127.0.0.1 whoami
ubuntu@127.0.0.1: Permission denied (publickey).
$ echo $?
255— 2026-09-26 時点の出力
検証環境
- 検証日
- 実行環境
alpine:3Alpine Linux v3.24
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- ユーザー名の間違い: SSH は接続先ユーザーのホーム配下の
authorized_keysしか見ない。ubuntu@で作ったサーバーにroot@で入ろうとすれば、鍵が正しくても該当する公開鍵は見つからない。 - 鍵が試されていない: 既定のファイル名(
id_ed25519・id_rsaなど)以外に置いた鍵は、-iかIdentityFileで指定しない限り提示されない。 - 登録した中身が違う:
authorized_keysに貼るのは.pubの中身である。
秘密鍵を貼っている、またはコピー時に折り返されて複数行になっていると一致しない。 - パーミッションが緩い: sshd(8)(新しいタブで開く) は、
authorized_keys・~/.ssh・ホームディレクトリが他ユーザーから書き込み可能な場合、StrictModesがnoでない限りその鍵を使わせない。
第三者に書き換えられる場所の鍵を信用しない、という設計である。 - サーバー側で無効:
sshd_configのPubkeyAuthentication no、あるいはAllowUsers/AllowGroupsで対象ユーザーが除外されている。
解決策
1. どの鍵が提示されたかを見る
ssh -v user@example.com 2>&1 | grep -E "Offering|Authentications|Server accepts"提示すらされていないなら鍵の指定が届いていない。
提示されて蹴られているならサーバー側を見る。
2. 公開鍵を正しく登録する
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@example.com手作業で貼る場合は、.pub の中身を 1 行のまま 追記する。
cat ~/.ssh/id_ed25519.pub | ssh user@example.com 'cat >> ~/.ssh/authorized_keys'3. パーミッションを直す
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~ホームディレクトリが drwxrwxr-x のようにグループ書き込み可になっていると、それだけで弾かれる。
4. 使う鍵を接続先ごとに固定する
# ~/.ssh/config
Host example
HostName example.com
User ubuntu
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesIdentitiesOnly yes を付けると、エージェントに載っている無関係な鍵を先に試して回数制限に達する事故を防げる(ssh_config(5)(新しいタブで開く))。