Вопрос или проблема
У меня есть сервер с оболочкой на встроенной системе (Это 32-разрядная система ARMel). Когда я пытаюсь войти в систему, я использую:
$ ssh root@ip
Невозможно провести согласование с ip порт 22: не найдено совпадающего типа хост-ключа. Их предложение: ssh-rsa,ssh-dss
Я попытался указать один из ожидаемых типов шифрования с помощью опции -c
:
$ ssh -c ssh-dss root@ip
Неизвестный тип шифрования 'ssh-dss'
или:
$ ssh -c ssh-rsa root@ip
Неизвестный тип шифрования 'ssh-rsa'
Итак, я не уверен, что делать дальше. У меня есть консоль UART, в которую я могу отправить команды, но я предпочел бы использовать SSH. Я знаю, что сервис запущен, но не знаю, как в него войти.
Я часто вижу это на устаревших встроенных системах Cisco, прошивка которых больше не может быть обновлена до современных стандартов ssh.
Помимо алгоритма хост-ключа, вам может понадобиться использовать устаревший алгоритм обмена ключами и/или спецификацию шифрования.
Пример Bash:
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1\
-oHostKeyAlgorithms=+ssh-rsa\
-oCiphers=+aes256-cbc\
<user>@asa5505
Хорошая новость в том, что OpenSSH (что я использую) обычно сообщает мне, какие алгоритмы или шифры предлагаются – в противном случае мне, возможно, пришлось бы много экспериментировать.
Если это так, доступные протоколы можно перечислить в OpenSSH с помощью:
ssh -Q [ciphers|hostkeyalgorithms|kexalgorithms|...]
Обновление:
Поскольку, похоже, есть большой интерес к использованию ssh_config (спасибо, Bob, Z и др.), я приведу пример для этого метода:
############################################
# ~/.ssh/config
Host 'asa5505*'
KexAlgorithms +diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa
Ciphers +aes128-cbc
Поскольку эти протоколы были признаны устаревшими по соображениям безопасности, вы должны ограничить их использование по умолчанию с помощью квалификации “Host” или “Match”, чтобы они использовались только на тех устаревших объектах, которые их требуют.
Также следует избегать добавления этих исключений в /etc/ssh/ssh_config или в /etc/ssh/ssh_config.d/, если ваше намерение не заключается в том, чтобы все текущие и будущие пользователи использовали их по умолчанию.
Для всех подробностей смотрите:
man ssh_config
Попробуйте использовать это:
ssh -oHostKeyAlgorithms=+ssh-rsa root@ip
Примечания:
Это также зависит от того, что вы запускаете на своем компьютере. Если вы используете что-то вроде Arch или Fedora36+, которые работают на OpenSSL3.0, то старые алгоритмы были устаревшими или отключены. Мне пришлось включить эту конфигурацию в свой ssh конфиг, находясь на 3.0 и подключаясь к старым серверам:
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Интересный трюк, который на данный момент работает и может помочь в обратной совместимости, если алгоритмы когда-либо будут удалены из OpenSSH, это использование контейнера с образом более старого дистрибутива Linux.
Есть больше накладных расходов (хотя контейнер может быть сохранен при стоимости в несколько десятков МБ) и возможные риски безопасности (возможные устаревшие версии OpenSSH), которые могут быть приемлемыми или нет.
Вот однострочник с его собственными ограничениями:
docker run --rm -it debian:jessie sh -c 'apt-get update && apt install -y --force-yes openssh-client && ssh the_host
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что ваш клиент SSH не может установить соединение с удалённым сервером из-за несовпадения типов ключей хоста. Сообщение об ошибке "Unable to negotiate with ip port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss" указывает, что сервер предлагает ключи ssh-rsa
и ssh-dss
, которые не поддерживаются вашим клиентом по умолчанию.
Вот несколько подходов для решения этой проблемы:
1. Используйте параметры командной строки SSH
Вы можете попробовать добавить рекомендации для алгоритмов ключей и шифров в команду SSH следующим образом:
ssh -oHostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group1-sha1 -oCiphers=+aes128-cbc root@ip
Этот подход позволяет явно указать клиенту использовать устаревшие алгоритмы, необходимые для успешного соединения.
2. Настройте файл конфигурации SSH
Если вы хотите сохранить эти настройки на постоянной основе, вы можете добавить их в файл конфигурации SSH, который находится по пути ~/.ssh/config
. Вот пример:
Host ip
KexAlgorithms +diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa
Ciphers +aes128-cbc
Этот метод более предпочтителен, так как позволяет легко управлять настройками для различных хостов и избежать необходимости вводить длинные аргументы каждый раз.
3. Обновление параметров для OpenSSH
Если вы используете OpenSSH 8.8 или более поздние версии, учитывайте, что некоторые устаревшие алгоритмы могли быть отключены. В таком случае вы можете добавить в ~/.ssh/config
следующие строки для решения проблемы:
Host *
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Однако, не забудьте использовать это с осторожностью, чтобы ограничения применялись только к необходимым устаревшим системам.
4. Запуск SSH-клиента в контейнере
Если вышеперечисленные методы не помогли, вы можете попробовать использовать контейнер с более ранней версией Linux, которая поддерживает более старые алгоритмы. Например:
docker run --rm -it debian:jessie sh -c 'apt-get update && apt install -y openssh-client && ssh root@ip'
Это позволяет вам использовать старый клиент SSH внутри контейнера без изменения системы хоста.
Заключение
Не забывайте, что использование устаревших алгоритмов может представлять угрозу безопасности. Если возможно, рассмотрите возможность обновления прошивки вашего сервера или используемого ПО для обеспечения совместимости с современными стандартами безопасности. При использовании тусклых алгоритмов обязательно ограничивайте их применение к только необходимым хостам для снижения рисков.