本文へスキップ
ecdsa.com
OpenSSH client (ssh, scp, sftp, git over SSH)SSH

エラーメッセージ

Permission denied (publickey).

別の表記

  • git@github.com: Permission denied (publickey).
  • Permission denied (publickey,password).

先頭に `user@host:` が付きます。括弧内のリストは、サーバーがまだ許可している方式を示します。たとえば `(publickey,password)` や `(publickey,gssapi-keyex,gssapi-with-mic)` です。

このエラーの意味

SSH の接続とホストの検証は成功しましたが、サーバーはクライアントが提示した公開鍵をどれも受け入れず、しかもサーバーが許可する方式は公開鍵認証だけです(括弧内のリスト)。鍵が拒否された理由がクライアントに伝わることはなく、その理由はサーバーのログにしか記録されません。GitHub、GitLab、Bitbucket では、同じメッセージは、そのリポジトリに対するアカウント(またはデプロイキー)に手元の鍵がどれも登録されていないことを意味します。

発生する理由

修正方法

  1. 1.

    どの鍵が提示されているかを確認する

    `ssh -v` は、クライアントが提示するすべての鍵と、サーバーがそれを受け入れたかどうかを表示します。`ssh -G` は、すべての設定を適用した後の実際のユーザーと identity ファイル(秘密鍵ファイル)を表示します。

    bash
    ssh -v deploy@server.example.com 2>&1 | grep -E "Offering|Server accepts|Authentications that can continue|send_pubkey_test"
    ssh-add -l                                  # keys the agent offers
    ssh -G deploy@server.example.com | grep -E "^(user|identityfile|identitiesonly) "
  2. 2.

    ホストごとに identity ファイルを固定する

    `IdentityFile` と `IdentitiesOnly yes` を組み合わせると、提示される鍵が 1 つだけになり、多数の鍵を持つエージェントで起こる「Too many authentication failures」を避けられます。

    text
    # ~/.ssh/config
    Host server.example.com
      User deploy
      IdentityFile ~/.ssh/deploy_ed25519
      IdentitiesOnly yes
  3. 3.

    サーバー側を修正し、ログを確認する

    正しいユーザーに対して、厳格なパーミッションで公開鍵をインストールし、sshd のログで具体的な拒否理由を確認してください。

    bash
    # On the server: install the key and fix modes (sshd ignores keys in group/world-writable paths)
    install -d -m 700 ~/.ssh && cat deploy_ed25519.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
    sudo journalctl -u ssh --since "10 min ago" | grep -E "Authentication refused|not in PubkeyAccepted|Failed publickey"

関連するエラー

署名エラーデータベースをすべて見る