できない.dev

SSH で「Permission denied (publickey)」が出て接続できない

鍵は作ったのに publickey で蹴られるのは、サーバー側が公開鍵を見つけられていないか、パーミッションが緩くて採用を拒否しているかのどちらかである。
ユーザー名・鍵の対応・authorized_keys の権限を順に切り分ける。

公開: 更新:

実行例あり(2026-09-26 に実環境で検証)

要約

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

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. ユーザー名の間違い: SSH は接続先ユーザーのホーム配下の authorized_keys しか見ない。ubuntu@ で作ったサーバーに root@ で入ろうとすれば、鍵が正しくても該当する公開鍵は見つからない。
  2. 鍵が試されていない: 既定のファイル名(id_ed25519・id_rsa など)以外に置いた鍵は、-i か IdentityFile で指定しない限り提示されない。
  3. 登録した中身が違う: authorized_keys に貼るのは .pub の中身である。
    秘密鍵を貼っている、またはコピー時に折り返されて複数行になっていると一致しない。
  4. パーミッションが緩い: sshd(8)(新しいタブで開く) は、authorized_keys・~/.ssh・ホームディレクトリが他ユーザーから書き込み可能な場合、StrictModes が no でない限りその鍵を使わせない。
    第三者に書き換えられる場所の鍵を信用しない、という設計である。
  5. サーバー側で無効: 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 yes

IdentitiesOnly yes を付けると、エージェントに載っている無関係な鍵を先に試して回数制限に達する事故を防げる(ssh_config(5)(新しいタブで開く))。

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