ssh 无法协商 - 找不到匹配的密钥交换方法

j0h*_*j0h 74 ssh

我正在尝试登录到我的 DSL 路由器,因为我在使用命令行邮件时遇到了问题。我希望能够重新配置路由器。

当我发出ssh命令时,会发生以下情况:

$ ssh enduser@10.255.252.1

Unable to negotiate with 10.255.252.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
Run Code Online (Sandbox Code Playgroud)

所以然后我查看了这个 stackexchange post,并将我的命令修改为这个,但是我遇到了一个不同的问题,这次是密码。

$ ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 enduser@10.255.252.1

Unable to negotiate with 10.255.252.1 port 22: no matching cipher found. Their offer: 3des-cbc
Run Code Online (Sandbox Code Playgroud)

那么是否有提供 3des-cbc加密的命令?我不确定 3des,比如我是否想将它永久添加到我的系统中。

是否有允许3des-cbc密码的命令?

这里有什么问题?这不是要求密码。

use*_*ser 71

在设置加密通道时会发生此特定错误。如果您的系统和远程系统不共享至少一种密码,则无法就密码达成一致,也无法使用加密通道。通常 SSH 服务器会提供少量不同的密码,以迎合不同的客户端;我不确定为什么您的服务器会被配置为只允许 3DES-CBC。

现在,3DES-CBC 并不可怕。它很慢,与其他一些算法相比,它提供的安全性较低,但只要正确选择密钥,它就不会立即被破解。CBC 本身在传输中可以修改密文时存在一些问题,但我强烈怀疑由此产生的损坏会被 SSH 的 HMAC 拒绝,从而减少影响。最重要的是,有比 3DES-CBC 更糟糕的选择,也有更好的选择。但是,在覆盖与安全相关的默认值(包括密码和密钥交换算法选择)时,请务必谨慎行事。这些默认值是有原因的默认值;一些非常聪明的人花费了一些脑力来考虑选项,并确定选择的默认值提供了最佳的整体安全性与性能权衡。

正如您所发现的,您可以使用-c ...(或-oCiphers=...) 指定从客户端提供的密码。在这种情况下,添加-c 3des-cbc仅允许来自客户端的 3DES-CBC。由于这与服务器提供的密码相匹配,因此可以建立加密通道,并且连接进入身份验证阶段。

您也可以将此添加到您的个人~/.ssh/config. 为了避免为了解决局部问题而进行全局更改,您可以将其放在一个Host节中。例如,如果您的 SSH 配置当前显示(虚拟示例):

Port 9922
Run Code Online (Sandbox Code Playgroud)

指定全局默认端口 9922 而不是默认 22,您可以为需要特殊配置的主机添加主机节,并为默认情况添加全局主机节。那会变成……

Host 10.255.252.1
    Ciphers 3des-cbc
    KexAlgorithms +diffie-hellman-group1-sha1
Host *
    Port 9922
Run Code Online (Sandbox Code Playgroud)

缩进是可选的,但我发现它大大提高了可读性。空行和以 开头的行将#被忽略。

如果您始终(或大部分)在该系统上以同一用户身份登录,您还可以指定该用户名:

Host 10.255.252.1
    Ciphers 3des-cbc
    KexAlgorithms +diffie-hellman-group1-sha1
    User enduser
Host *
    Port 9922
Run Code Online (Sandbox Code Playgroud)

Host *如果 ~/.ssh/config 中没有任何内容,则不需要添加节,因为在这种情况下,只有编译入或系统范围的默认值(通常来自 /etc/ssh/ssh_config)用过的。

此时,连接到这台主机的 ssh 命令行简化为

$ ssh 10.255.252.1
Run Code Online (Sandbox Code Playgroud)

和系统上的所有其他用户以及从系统到所有其他主机的连接都不受这些更改的影响。


j0h*_*j0h 55

好的,我阅读了联机帮助页并弄清楚了。

我不想修改我的配置文件,所以我在手册页中搜索了术语“密码”,它显示了我的-c选项;这允许我指定加密类型。结束命令是:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -c 3des-cbc enduser@10.255.252.1
Run Code Online (Sandbox Code Playgroud)

  • 手动选择密码时要小心,除非您知道自己在做什么(可用性等),否则您很容易选择较弱的(er)密码。 (5认同)
  • 绝对是最通用的解决方案。在收到错误“无法与 10.255.252.1 端口 22 协商:未找到匹配的密码”后,我使用“ssh enduser@10.255.252.1 -c aes256-cbc”成功连接。他们的报价:aes128-cbc,3des-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,rijndael128-cbc,rijndael192-cbc,rijndael256-cbc,rijndael-cbc@lysator.liu.se`。Windows 服务器 (freeSSHd) 和 Windows 客户端 (cmd.exe) (2认同)

Tre*_*ree 5

我最近在使用 PuTTY 连接到较新版本的 Ubuntu 时遇到了这个问题。PuTTY 的早期版本似乎没有更新密码。所以下载最新版本的 PuTTY 解决了这个问题。那可能是另一种解决方案。


GCh*_*huf 5

我在设置新的 SFTP 服务器(在 Ubuntu 22 上)时遇到了这个问题。告诉所有客户更新他们的密钥和密码不是一个选择(欢迎来到战壕)。

我添加KexAlgorithms +diffie-hellman-group1-sha1到文件的底部/etc/ssh/sshd_config- 但在配置部分之前Match group sftp- 否则我会收到以下错误:

Jun 22 09:43:22 sftp02 sshd[88559]: /etc/ssh/sshd_config line 140: Directive 'KexAlgorithms' is not allowed within a Match block
Run Code Online (Sandbox Code Playgroud)

之后,我仍然需要更新密码:

Jun 22 09:44:45 sftp02 sshd[88613]: Unable to negotiate with 10.10.1.154 port 46973: no matching host key type found. Their offer: ssh-rsa,ssh-dss [preauth]
Run Code Online (Sandbox Code Playgroud)

解决方案:将其添加到 sshd_config 中:

HostkeyAlgorithms +ssh-rsa,ssh-dss
Run Code Online (Sandbox Code Playgroud)

之后不要忘记重新启动 ssh 服务。就我而言:

systemctl restart sshd.service
Run Code Online (Sandbox Code Playgroud)

  • 总而言之,它对我有用:我将此片段添加到 /etc/ssh/sshd_config 中: # 与旧版 ssh 客户端一起使用,在我的例子中,监督旧版客户端 KexAlgorithms +diffie-hellman-group1-sha1 HostkeyAlgorithms +ssh-rsa, ssh-dss 在 de Banner 和 sftp 子系统部分之间。重新启动 ssh 服务,它就神奇地工作了。谢谢! (3认同)