SSH-“无法协商...未找到匹配的主机密钥类型。”

SSH-“无法协商...未找到匹配的主机密钥类型。”

我在嵌入式系统上有一个 shell 服务器(它是一个 32 位 ARMel 系统)。当我登录它时,我使用:

$ ssh root@ip 
Unable to negotiate with ip port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

我尝试为其提供预期的密码类型之一,并带有以下-c选项:

$ ssh -c ssh-dss root@ip 
Unknown cipher type 'ssh-dss'

或者:

$ ssh -c ssh-rsa root@ip
Unknown cipher type 'ssh-rsa'

所以我不知道下一步该做什么。我有一个 UART 串​​行控制台,可以向其发送命令,但我宁愿使用 SSH。我知道它正在运行该服务,但我不知道如何登录它。

答案1

我在旧版 Cisco 嵌入式系统中经常看到这种情况,其固件无法再升级到现代 ssh 标准。

除了主机密钥算法之外,您可能还需要使用过时的密钥交换算法和/或密码规范。

重击示例:

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

由于出于安全原因这些协议已被弃用,因此您应该使用“主机”或“匹配”限定来限制默认使用,以便它们仅用于需要它们的旧目标。

同样,您应该避免将这些异常放入/etc/ssh/ssh_config或以下/etc/ssh/ssh_config.d/除非您的目的是让所有当前和未来的用户默认使用它们。

有关所有详细信息,请参阅:

man ssh_config

答案2

尝试使用这个:

ssh -oHostKeyAlgorithms=+ssh-rsa root@ip

笔记:

答案3

它还取决于您在自己的计算机上运行的内容。如果您运行的是 Arch 或 Fedora36+(基于 OpenSSL3.0),则旧算法已被弃用或禁用。我必须在 3.0 连接到旧服务器的 ssh 配置中包含此配置:

HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa

答案4

一个巧妙的技巧是使用旧版 Linux 发行版映像的容器,该技巧目前有效,并且如果算法从 OpenSSH 中删除,则可以帮助实现向后兼容性。

存在更多开销(尽管可以以几十 MB 的成本保留容器),并且可能存在安全风险(可能是未维护的 OpenSSH 版本),这些风险可能是可接受的,也可能是不可接受的。

这是一句单行话,有其自身的局限性:

docker run --rm -it debian:jessie sh -c 'apt-get update && apt install -y --force-yes openssh-client && ssh the_host

相关内容