#Что означает ошибка
user@203.0.113.10: Permission denied (publickey).
При входе по ключу клиент по очереди предлагает серверу свои ключи, а сервер ищет подходящий открытый ключ в файле ~/.ssh/authorized_keys нужного пользователя. Если совпадения нет или сервер не может доверять файлу, вход отклоняется. В скобках — перечень методов, которые сервер ещё готов принять: (publickey) — только ключи, (publickey,password) — ключи и пароль.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Ключ не добавлен на сервер или это другой ключОткрытый ключ, соответствующий вашему закрытому, отсутствует в authorized_keys — либо в файле лежит не тот ключ. | В ssh -v ключ предлагается («Offering public key»), но принят не будет; на сервере в журнале нет «Accepted publickey». | Добавьте правильный открытый ключ на сервер (шаг 4). |
Неверные права на файлы и каталогиСервер игнорирует authorized_keys, если каталог ~/.ssh или домашний каталог доступны на запись группе или всем (по умолчанию включён StrictModes). | В журнале сервера есть запись Authentication refused: bad ownership or modes. | Исправьте права: ~/.ssh — 700, authorized_keys — 600, домашний каталог не должен быть открыт на запись другим. |
Неверное имя пользователяВы входите как root, а ключ добавлен для ubuntu, admin или другого пользователя. | Другая учётная запись принимает тот же ключ; у облачных образов имя часто задано провайдером. | Подключайтесь тем пользователем, для которого добавлен ключ: ssh пользователь@хост. |
Сервер запрещает вход по ключам или для этого пользователяВ sshd_config отключена PubkeyAuthentication, ограничения AllowUsers/AllowGroups либо запрещён вход root. | В журнале видно отклонение пользователя; настройки изменились недавно. | Проверьте sshd_config (шаг 5), после правок перезагрузите службу sshd. |
| Клиент не предлагает нужный ключКлюч лежит не в стандартном месте, не добавлен в агент, либо у вас так много ключей, что сервер обрывает попытки. | В ssh -v нет строки с вашим ключом или сообщение Too many authentication failures. | Явно укажите ключ: -i путь и -o IdentitiesOnly=yes (шаг 3). |
#Алгоритм диагностики
- Запустите подключение с подробным выводомНа компьютере откройте терминал и выполните
ssh -vvv пользователь@серверс реальным именем; найдите строкиOffering public key,Server accepts keyилиPermission denied. Не публикуйте весь подробный вывод без проверки: в нём могут быть имена внутренних серверов и учётных записей. - Проверьте имя пользователя и адресУточните у администратора, какое имя пользователя и порт должны использоваться, поскольку образы Ubuntu, Debian и облачные платформы часто имеют разные начальные учётные записи. Проверьте, что подключаетесь именно к нужному IP/DNS, а не к старой машине после смены хостинга.
- Укажите ключ явноЗатем выполните
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 пользователь@сервер; замените путь на фактический приватный ключ. Если появляетсяNo such file, найдите ключ на своём компьютере, еслиUNPROTECTED PRIVATE KEY FILE— исправьте его локальные права. Не передавайте приватный ключ на сервер. - Проверьте файлы на сервереЧерез консоль провайдера проверьте на сервере соответствующий публичный ключ в
~/.ssh/authorized_keys, владельца домашнего каталога и права.ssh/authorized_keys. Командаssh-copy-idработает только если уже есть разрешённый способ входа; при полном отказе в SSH используйте консоль и добавление ключа через панель провайдера. - Проверьте настройки sshd и журналПроверьте настройки
PubkeyAuthentication,AuthorizedKeysFile, блокиMatchи запреты пользователей в выводеsshd -T, а также журналыjournalctl -u sshили/var/log/auth.log. После точечной правки выполнитеsshd -tи откройте новое подключение, не закрывая рабочую консоль. Не включайте парольную авторизацию всему Интернету как обход.
#Шаг 1 и 3. Подробный вывод и явный ключ
IdentitiesOnly=yes запрещает отправлять другие ключи из агента.ssh -v -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes пользователь@адрес-сервера#Шаг 4. Добавление ключа и права на сервере
authorized_keys на сервере. Работает, пока доступен вход по паролю; если пароль запрещён, добавьте ключ через консоль провайдера.ssh-copy-id -i ~/.ssh/id_ed25519.pub пользователь@адрес-сервераchmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keysls -ld ~ ~/.ssh ~/.ssh/authorized_keys#Шаг 5. Настройки и журнал sshd
sshd — тогда замените -u ssh на -u sshd.sudo sshd -T | grep -Ei "pubkeyauthentication|allowusers|allowgroups|permitrootlogin|passwordauthentication"sudo journalctl -u ssh -n 30 --no-pagerЕсли вы меняете sshd_config, всегда проверьте синтаксис командой sudo sshd -t и держите открытой текущую рабочую сессию, пока не убедитесь, что новая сессия подключается успешно — иначе можно запереть себя на сервере.
#Как проверить результат
- Подключение проходит без запроса пароля; в журнале сервера есть
Accepted publickey for …. ssh -vпоказывает, что принят именно тот ключ, который вы ожидали.- Права на
~/.sshиauthorized_keysсоответствуют рекомендованным.
#Если не помогло
Проверьте, не включён ли на сервере SELinux или AppArmor с ограничениями на домашние каталоги, и не лежит ли домашний каталог на сетевой файловой системе с особыми правами. Попробуйте сгенерировать новую пару ключей (ssh-keygen -t ed25519) и добавить её заново, а также убедитесь, что на сервере не истёк срок действия учётной записи.