Перейти к содержимому
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` показывает фактического пользователя и файлы ключей с учётом всей конфигурации.

    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.

    Закрепите файл ключа за каждым хостом

    `IdentityFile` вместе с `IdentitiesOnly yes` предлагает ровно один ключ и избавляет от «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"

Связанные ошибки

Открыть всю базу ошибок подписей