我在嵌入式系统上有一个 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
答案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