我在嵌入式系统上有一个 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。我知道它正在运行该服务,但我不知道如何登录它。
我在遗留的 Cisco 嵌入式系统中经常看到这种情况,这些系统的固件无法再升级到现代 ssh 标准。
除了主机密钥算法之外,您可能还需要使用过时的密钥交换算法和/或密码规范。
重击示例:
好消息是 OpenSSH(我使用的)通常会告诉我提供了哪些算法或密码——否则我可能不得不进行大量的试验和错误。
如果我这样做,可用的协议可以在 OpenSSH 中列出:
更新: 由于使用 ssh_config(感谢 Bob、Z 等)执行此操作似乎很有趣,我将为该方法提供一个示例:
由于出于安全原因这些协议已被弃用,您应该使用“主机”或“匹配”限定来限制默认使用,以便它们仅用于需要它们的那些遗留目标。
同样,您应该避免将这些例外放入/etc/ssh/ssh_config或/etc/ssh/ssh_config.d/下,除非您打算让所有当前和未来的用户默认使用它们。
有关所有详细信息,请参阅:
尝试使用这个:
笔记:
它还取决于您在自己的机器上运行的是什么。如果您正在运行诸如 Arch 或 Fedora36+ 之类的东西,它在 OpenSSL3.0 上,那么旧算法已被弃用或禁用。我必须将此配置包含在我的 ssh 配置中,该配置位于 3.0 连接到旧服务器的位置:
一个巧妙的技巧,目前有效,如果算法从 OpenSSH 中删除,可以帮助向后兼容,它是使用旧 Linux 发行版映像的容器。
有更多的开销(尽管容器可以以几十 MB 的成本保留),并且可能存在安全风险(可能是未维护的 OpenSSH 版本),这些风险可能是可接受的,也可能是不可接受的。
这是一个单行代码,有其自身的局限性:
docker run --rm -it debian:jessie sh -c 'apt-get update && apt install -y --force-yes openssh-client && ssh the_host