Назад в блог

SSH Permission denied (publickey): настоящее решение

18 сентября 2026 г.

В 02:10 деплой умер на строке, которую я набирал тысячу раз: ssh deploy@stagingPermission denied (publickey). Ключ был в порядке. Не в порядке было предложение.

TL;DR: Permission denied (publickey) значит, что каждый ключ, предложенный клиентом, отклонён сервером — это вердикт переговоров, а не опечатка в пароле. Диагностика: ssh -vvv (какие ключи предлагались) и серверный лог journalctl -u ssh (какие ключи отклонены и почему). Дальше исправляйте одну из четырёх причин: не тот пользователь, ключа нет в authorized_keys, слишком открытые права или ключ ssh-rsa, который отвергает OpenSSH 8.8+. ssh-copy-id предотвращает большинство повторов.

$ ssh -T [email protected]
[email protected]: Permission denied (publickey).

Ошибка — это вердикт, а не подсказка: отвергнуто всё, что было в предложении.

Почему SSH пишет «Permission denied (publickey)»?

Аутентификация по публичному ключу — это переговоры в формате «предложил — отверг». Клиент предлагает каждый ключ, который находит: идентичности из агента, из вашего ~/.ssh/config, имена по умолчанию (id_ed25519, id_rsa) и всё, что передано через -i. Сверяет каждый вариант с ~/.ssh/authorized_keys целевого аккаунта. Если ничего не совпало, а вход по паролю отключён или исчерпан, клиент печатает строку, которую каждый devops-инженер знает наизусть.

Для отладки важны два факта. Первый: в сообщении не сказано, под каким пользователем вы стучались — в половине случаев отличный ключ лежит в authorized_keys не того аккаунта. Второй: сервер уже сказал, почему — sshd логирует каждое отклонённое предложение. Тот самый стектрейс, который никто не заказывал, но нужен всем, — это -vvv.

Как узнать, какой ключ SSH предлагает на самом деле?

ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
# debug1: Offering public key: /home/you/.ssh/id_ed25519 RSA-SHA256 (explicit)
# debug1: Authentications that can continue: publickey
# deploy@staging: Permission denied (publickey).

Читаем три строки: Offering public key (что предложил клиент), Authentications that can continue (что сервер ещё принимает — если password нет, запроса пароля не будет никогда) и финальный вердикт. Если ваш ключ в списке предложений так и не появился, проблема на стороне клиента: неверный путь -i, забытый IdentityFile в ~/.ssh/config или агент (ssh-add -l), который первым отвечает устаревшей идентичностью.

Какие четыре причины реальные?

ПричинаПризнакИсправление
Не тот пользовательКлюч работает для root@host, не работает для deploy@hostКлюч должен лежать в ~/.ssh/authorized_keys того самого пользователя
Ключ не установленВ логе сервера Failed publickey на каждое предложениеssh-copy-id user@host
Права слишком открытыКлиент: WARNING: UNPROTECTED PRIVATE KEY FILE — ключ пропускается, не предлагаетсяchmod 700 ~/.ssh; chmod 600 ~/.ssh/*
Старый ssh-rsaСервер на OpenSSH 8.8+; старый RSA-ключ не принимается никогдаПерегенерировать в ed25519 или обновить ключ

Причину с правами стоит разобрать отдельно: OpenSSH требует её жёстко. Приватный ключ, который читают группа или остальные, отвергается самим клиентом и молча выпадает из предложения. Исправление — две команды:

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

Причина ssh-rsa ловит старые CI-образы и Raspberry Pi: OpenSSH 8.8 (релиз 2021-10-01, openssh.com/txt/release-8.8) отключила подписи ssh-rsa — вариант на SHA-1 — по умолчанию. Из release notes: “the ssh-rsa signature scheme is … disabled by default”. RSA-ключ 2018 года не сломан — его формат подписи просто больше не «в ходу». Генерация ключа ed25519 (ssh-keygen -t ed25519) — прочный ответ, а облачные консоли дают последовательную консоль на случай, если вы отрежете себе доступ посреди починки.

Если sshd отказывается стартовать, пока вы правите его конфиг — это другая охота, см. systemd service not starting.

Как узнать, почему сервер отклонил ключ?

Серверный лог — честный свидетель. В Ubuntu (systemd) sshd логирует вердикт по каждому предложению:

journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
# sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:...
# sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:...

Failed publickey с незнакомым отпечатком — клиент предложил не тот ключ, что вы думали; назад к -vvv. Failed publickey с вашим отпечатком — ключ верный, но не установлен для этого аккаунта, либо неверные права на home на стороне сервера (то же правило 700/600 для серверных ~/.ssh и ~/.ssh/authorized_keys).

Как правильно установить свой ключ?

ssh-copy-id deploy@staging
# Number of key(s) added: 1
ssh -o BatchMode=yes deploy@staging 'echo ok'   # неинтерактивная проверка

ssh-copy-id добавляет ваш публичный ключ в authorized_keys целевого аккаунта с разумными правами — команда существует потому, что ручная вставка в authorized_keys ровно так же часто спотыкается о лишний перевод строки или отсутствующий каталог. Проверка через BatchMode — настоящая: она отключает все запросы, поэтому успех означает, что вход принёс один лишь ключ. Когда ключ работает, scp и rsync наследуют ту же аутентификацию бесплатно — выбор между ними вопрос полосы пропускания, а не учётных данных (rsync vs scp).

Триаж за 30 секунд

ssh -vvv user@host 2>&1 | grep -i offering      # 1. какие ключи предлагались?
journalctl -u ssh -n 50 | grep -i publickey     # 2. почему отклонены?
ls -ld ~/.ssh ~/.ssh/authorized_keys            # 3. 700 / 600?
ssh-copy-id user@host                           # 4. установить, проверить через BatchMode

Permission denied (publickey) — итог переговоров, а не запрос пароля: сервер отверг каждый ключ из предложения, и его лог уже знает почему.

Четыре команды по порядку — и сбой перестаёт быть загадкой: одна из них каждый раз называет виновника. У меня это была устаревшая идентичность агента, отвечавшая раньше правильного ключа — ssh-add -d, и в 02:31 деплой снова позеленел.

FAQ

Почему SSH пишет Permission denied (publickey)?

Это значит, что каждый ключ, предложенный клиентом, отклонён сервером, а аутентификация по паролю или keyboard-interactive не предпринималась или запрещена. Это вердикт переговоров по вашим ключам — а не опечатка в пароле.

Как исправить SSH permission denied (publickey) в Ubuntu?

Проверьте сторону сервера через journalctl -u ssh -n 50, убедитесь, что ваш публичный ключ лежит в ~/.ssh/authorized_keys нужного пользователя, и что права 700 на ~/.ssh и 600 на authorized_keys и приватный ключ.

Почему ssh -i мойключ всё равно не работает?

Три обычные причины: права на приватный ключ слишком открыты и OpenSSH отказывается его загружать, сервер работает под OpenSSH 8.8+, где ssh-rsa (подписи SHA-1) отключён, или ключ не лежит в authorized_keys того пользователя.

Как добавить свой публичный ключ на сервер?

Выполните ssh-copy-id user@host — команда добавит ваш публичный ключ в ~/.ssh/authorized_keys с правильными правами. Если вход по паролю уже отключён, делайте это через консоль, к которой ещё есть доступ.

— mrsaynothing

— mrsaynothing

Заметки об ИИ, Linux и self-hosting.

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

.gitignore не работает? Вот настоящее решение

Нравятся заметки? Я зарабатываю этим на жизнь. нанять меня