Сообщение об ошибке
userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
Также выводится как
- userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
- userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedKeyTypes [preauth]
- userauth_pubkey: signature algorithm ssh-ed25519 not in PubkeyAcceptedAlgorithms [preauth]
Формулировки по релизам sshd (сверено с исходным кодом OpenSSH): 9.0 и новее — «signature algorithm … not in PubkeyAcceptedAlgorithms»; 8.5–8.9 — «key type … not in PubkeyAcceptedAlgorithms»; 8.4 и более ранние — «key type … not in PubkeyAcceptedKeyTypes» (параметр переименован в 8.5). Алгоритм в сообщении зависит от клиента и от ограничений сервера.
OpenSSH server (sshd) log — the client sees only "Permission denied (publickey)."
Что это означает
Журнал сервера объясняет «Permission denied (publickey)»: клиент предъявил алгоритм подписи, которого сервер не принимает. В случае `ssh-rsa` это схема подписи RSA на основе SHA-1, отключённая по умолчанию начиная с OpenSSH 8.8 (2021). Сам ключ RSA в порядке (тот же ключ работает с алгоритмами `rsa-sha2-256`/`rsa-sha2-512`), но клиент (старый OpenSSH, устаревшая библиотека или встраиваемое устройство) знает только вариант с SHA-1.
Почему это происходит
Старый SSH-клиент или библиотека подписывает алгоритмом ssh-rsa
частоOpenSSH до 7.2, Paramiko до 2.9 (в том числе внутри плагина подключения paramiko в Ansible), оригинальный JSch 0.1.55 (плагины Jenkins, IDE), старые версии golang.org/x/crypto и многие сетевые устройства создают только подписи `ssh-rsa`.
Сервер дополнительно ограничивает алгоритмы
иногдаРуководства по усилению защиты задают в `PubkeyAcceptedAlgorithms` короткий список (например, только Ed25519 и ECDSA); ключи RSA или Ed25519 вне этого списка отклоняются, как показывает вариант этой ошибки с `ssh-ed25519`.
Ключ DSA
иногда`ssh-dss` отключён начиная с OpenSSH 7.0 и удалён в 10.0. Ключи DSA необходимо заменить.
Как исправить
- 1.
Используйте современный ключ или современный клиент
Ключ Ed25519 полностью снимает проблему RSA/SHA-1; иначе обновите клиентскую библиотеку, чтобы она согласовывала `rsa-sha2-*`.
bash # Best: a modern key type, which every current client signs correctly ssh-keygen -t ed25519 -C "deploy@ci" -f ~/.ssh/deploy_ed25519 # Or keep the RSA key and use a client that supports rsa-sha2-256/512 # (OpenSSH >= 7.2, Paramiko >= 2.9, JSch fork 0.2.x, golang.org/x/crypto >= 2022, PuTTY >= 0.75) - 2.
Если без этого никак, разрешите ssh-rsa точечно
Блок `Match` для одного устаревшего устройства не допускает подписи SHA-1 для всех остальных. Считайте это временной мерой.
text # /etc/ssh/sshd_config.d/legacy-device.conf - only for one legacy client, and remove it afterwards Match Address 10.0.5.17 PubkeyAcceptedAlgorithms +ssh-rsa
Связанные ошибки
Permission denied (publickey).OpenSSH client (ssh, scp, sftp, git over SSH)Unable to negotiate with 127.0.0.1 port 22: no matching host key type found. Th…OpenSSH client (8.8+) connecting to a server that only offers legacy host key algorithmsssh: handshake failed: ssh: unable to authenticate, attempted methods [none pub…golang.org/x/crypto/ssh (Go)