Permission denied (publickey): предложение, отказ и четыре причины
ssh -vvv показывает, что предлагал клиент, journalctl — почему сервер отказал: не тот пользователь, ключа нет в authorized_keys, слишком открытые права или ssh-rsa после 8.8.
■ space · провод, в повторе · fig 1
Permission denied (publickey) = все ключи, предложенные клиентом, отклонены — вердикт переговоров, а не опечатка в пароле.
Диагностика: ssh -vvv показывает, какие ключи предлагались; journalctl -u ssh — почему их отклонили.
Дальше это одна из четырёх причин: не тот пользователь, ключ не в authorized_keys, слишком открытые права или ssh-rsa, отвергнутый OpenSSH 8.8+. ssh-copy-id предотвращает большинство повторов.
01ПРОВОД
клиент предлагает · сервер отказывает · три строки решают, на чьей стороне ваша проблема
$ ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
debug1: Offering public key: /home/deploy/.ssh/id_rsa RSA SHA256:9T4xQmV…
02:10:03 — ОТКЛОНЕНО. ДЕПЛОЙ УМЕР НА SSH-RSA02:14:41 — тот же клиент, принят на ed25519
ПРЕДЛОЖЕН id_rsa → ОТКЛОНЁН · ПРЕДЛОЖЕН id_ed25519 → ПРИНЯТ · РЕЕСТР 1R · 1A
лента — это список предложений: каждый штамп, который снимает кольцо, ssh -vvv печатается строкой
02СВИДЕТЕЛЬ
кольцо ведёт счёт — сервер вёл свой с самого начала: journalctl уже записал каждый вердикт
Oct 18 02:10:03 staging sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:9T4xQmV…
Oct 18 02:14:41 staging sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:KP7wLn…
две строки, одна дуга: предложение RSA отклонено в 02:10 — смерть деплоя — затем тот же клиент, четыре минуты спустя, принят на ed25519
journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
проверка: journalctl -u ssh -n 50 | grep Accepted → строка с ВАШИМ отпечатком и пользователем
03ТАБЛИЦА ПРИЧИН
лог называет вердикт, но не причину — шесть форм дают один отказ
| причина | улика | лечение |
|---|---|---|
| Правильный ключ есть, приходит не тот | -vvv предлагает личность, которую вы не узнаёте | ssh-add -l — перечислить, ssh-add -d — сбросить протухший |
-i mykey игнорируется | IdentityFile в config перекрывает порядок предложений | Почините или удалите блок в ~/.ssh/config |
| Ключ не установлен | Лог сервера показывает Failed publickey на каждое предложение — authorized_keys: пусто, 0 ключей | ssh-copy-id user@host |
| Не тот пользователь | Ключ работает для root@host, не работает для deploy@host | Ключ должен лежать в ~/.ssh/authorized_keys |
| Слишком открытые права | WARNING: UNPROTECTED PRIVATE KEY FILE — ключ пропускается, никогда не предлагается | chmod 700 ~/.ssh; chmod 600 ~/.ssh/* |
| Легаси-ключ ssh-rsa | Сервер на OpenSSH 8.8+; старый RSA-ключ не принимается | Пересоздайте как ed25519 или обновите ключ |
каждая строка повторяется на проводе — нажмите её клавишу на конвейере и смотрите, как переговоры выбирают эту причину
ssh -o BatchMode=yes … 'echo ok' — ни промпта, ни надежды, только ok.04ПРОПУСК ПРАВ
каждая причина из таблицы дошла до сервера — эта умирает на клиентской стороне провода
drwx------ · 755 — слишком открыто-rw------- · 644 и 664 слишком открытыchmod 700 ~/.ssh
chmod 600 ~/.ssh/*
проверка: ls -ld ~/.ssh → drwx------ · ls -l ~/.ssh/id_ed25519 → -rw-------
05ЯЗЫК, ВЫВЕДЕННЫЙ ИЗ УПОТРЕБЛЕНИЯ
на одном отказе стоит дата — 8.8, вышедший 2021-10-01, перестал говорить на ssh-rsa
«схема подписей ssh-rsa ... по умолчанию отключена» — примечания к релизу OpenSSH 8.8, 2021-10-01.
RSA-ключ, созданный в 2018, не сломан — просто его формат подписи больше не понимают
ssh-keygen -t ed25519 — свежий ключ на языке, который все серверы ещё понимаютrsa-sha2-256 не требует пересоздания — подпись обновляется на местеssh-copy-id дописывает ключ и ставит разумные права — он существует, потому что ручная вставка спотыкается о частичные строкиssh-keygen -t ed25519
ssh-copy-id deploy@staging
$ ssh -o BatchMode=yes deploy@staging 'echo ok'
ok
проверка: ssh -o BatchMode=yes deploy@staging 'echo ok' → ok, без промпта
конец провода · ничего не fetchили · всё локально