SSH接続時の「Permission denied (publickey)」エラーを修正する

intermediate🌐 Networking2026-07-07| Linux / macOS / Windows (WSL, Git Bash, PuTTY) — OpenSSHクライアントからリモートLinuxサーバー(Ubuntu、Debian、CentOS、Amazon Linuxなど)への接続

Error Message

Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
#ssh#linux#devops#セキュリティ

エラーの内容

$ ssh user@192.168.1.100
user@192.168.1.100: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

クラウドサーバーでよく見られる短いバリアント:

Permission denied (publickey).

SSHが接続を拒否しました。サーバーはサポートしているすべての認証方式を列挙しましたが、どれも機能しませんでした。厄介ですが、解決できます。ほぼ必ず5つの根本原因のいずれかに行き着きます。

根本原因

  • 秘密鍵がサーバーの ~/.ssh/authorized_keys にある公開鍵と一致していない
  • ~/.ssh/ または authorized_keys のファイルパーミッションが緩すぎる — SSHがそれらの使用を拒否する
  • SSHエージェントに鍵が読み込まれていない
  • 間違ったユーザー名で接続しようとしている(EC2、DigitalOceanなどでよくある)
  • 鍵ファイルのパスが間違っているか、-i オプションを指定し忘れている

ステップ1:まずSSHを詳細モードで実行する

推測はやめましょう。SSHに何を試みているか正確に教えてもらいます:

ssh -vvv user@your-server.com

出力をスクロールして、次のような行を探します:

debug1: Offering public key: /home/you/.ssh/id_rsa RSA ...
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.

「Offering public key」の後に「No more authentication methods」が表示される場合、サーバーがその特定の鍵を拒否したことを意味します。「Offering」の行が全く表示されない場合は、クライアントが試す鍵を見つけられていません。

修正1:公開鍵がauthorized_keysに登録されているか確認する

最も一般的な原因です。ローカルマシンから公開鍵を取得します:

cat ~/.ssh/id_rsa.pub
# または
cat ~/.ssh/id_ed25519.pub

次にサーバーで、鍵が登録されているか確認します:

cat ~/.ssh/authorized_keys

登録されていない場合は追加します:

# ローカルマシンから:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your-server.com

# または手動で — 鍵を追記する:
echo "your-public-key-content" >> ~/.ssh/authorized_keys

確認すべき点として、各鍵は改行のない1行でなければなりません。鍵の途中に改行があると、SSHはそれを認識できません。

修正2:SSHファイルのパーミッションを修正する

パーミッションが緩すぎると、SSHは警告なしに鍵を無視します。警告も分かりやすいメッセージも出ず、ただ拒否するだけです。見落としやすいですが、修正はとても簡単です。

サーバー上で:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

ローカルマシン上で、秘密鍵を修正します:

chmod 600 ~/.ssh/id_rsa
# または
chmod 600 ~/.ssh/id_ed25519

SSHが適用するルール:

  • ~/.ssh/ ディレクトリ — 700(所有者のみ)でなければならない
  • authorized_keys — 最大でも 600 または 640 でなければならない
  • 秘密鍵ファイル — 600 でなければならない(誰でも読める状態だとSSHが使用を拒否する)

ヒント:chmodの数字が何を意味するか覚えられない場合は、ToolCraftのUnixパーミッション計算ツールを使うと視覚的にパーミッションを設定でき、対応するchmod番号も確認できます。640と644のどちらが正しいか迷ったときに本当に役立ちます。

修正3:-iで正しい鍵を指定する

システムに複数の鍵がある場合、SSHは自動的に1つを選びますが、間違った鍵を選ぶ可能性があります。明示的に指定しましょう:

ssh -i ~/.ssh/my-specific-key user@your-server.com

AWS EC2の場合は、インスタンス作成時にダウンロードした.pemファイルを使用します:

ssh -i ~/Downloads/my-ec2-key.pem ec2-user@your-ec2-ip

ユーザー名にも注意してください。EC2 Amazon Linuxは ec2-user、Ubuntuは ubuntu、Debianは admin を使用します。正しい鍵を使っていても、ユーザー名が間違っていると接続拒否されます。

修正4:SSHエージェントに鍵を追加する

SSHエージェントは復号された鍵をメモリにキャッシュするため、接続のたびにパスフレーズを入力する必要がなくなります。エージェントが起動していないか鍵が読み込まれていないと、認証時に鍵が提示されない場合があります。エージェントを起動して鍵を追加します:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

現在読み込まれている鍵を確認します:

ssh-add -l

「The agent has no identities」と表示される場合、何も読み込まれていません。ssh-add を実行してパスフレーズを入力してください。

修正5:サーバーのauthorized_keysを確認する(SELinux/所有者の問題)

CentOSやRHELサーバーはSELinuxを実行しており、標準のUnixパーミッションに加えてファイルコンテキストを強制します。正しいchmod値だけでは不十分な場合があります。ファイルコンテキストを確認します:

ls -laZ ~/.ssh/authorized_keys

コンテキストが正しくない場合は、復元します:

restorecon -Rv ~/.ssh

ついでに、~/.ssh が正しいユーザーによって所有されているか確認します:

ls -la ~ | grep .ssh
# 表示されるべき内容: drwx------ 2 youruser youruser

sudoコマンドを実行した後、~/.ssh がrootの所有になってしまうことは意外とよくあります。修正するには:

sudo chown -R youruser:youruser ~/.ssh

修正6:サーバーのsshdの設定を確認する

最後に確認する価値があります — サーバー自体が公開鍵認証を完全に拒否するよう設定されている場合があります:

sudo grep -E 'PubkeyAuthentication|AuthorizedKeysFile|PermitRootLogin' /etc/ssh/sshd_config

次の設定になっているか確認します:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

PubkeyAuthenticationno に設定されている場合は変更して、sshdを再起動します:

sudo systemctl restart sshd

修正の確認

変更後は、詳細モードでテストします:

ssh -v user@your-server.com

認証が成功した場合は次のように表示されます:

debug1: Authentication succeeded (publickey).

まだ失敗する場合は、修正手順を順番に試してください。パーミッションの問題と間違った鍵が約80%のケースを占めています — 修正2か修正3までに解決できる可能性が高いです。

予防策

  • ssh-keygen -t ed25519 で鍵を生成する — Ed25519は署名操作においてRSA-2048より大幅に高速で、将来の攻撃に対してもより堅牢とされている
  • 手動でコピー&ペーストする代わりに ssh-copy-id で鍵をデプロイする — 自動的に正しいパーミッションが設定される
  • ユーザー名や鍵のパスを混同しないよう、接続情報を ~/.ssh/config に保存する:
Host myserver
  HostName 192.168.1.100
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519
  • ~/.ssh/ ディレクトリをバックアップしておく。秘密鍵を失うと、その鍵が登録されているすべてのサーバーへのアクセスが失われ、復旧する手段はない
  • SSHキーを定期的にローテーションし、必ず強力なパスフレーズで保護する。ToolCraftのパスワードジェネレーターはここで役立つ — SSHキーのパスフレーズは強力でありながら、実際にタイプできるものである必要がある

Related Error Notes