OpenSSH 遗留选项

OpenSSH实现了标准SSH实现的所有兼容加密算法,但是由于一些旧算法被发现强度较弱,所以默认不会激活。

当SSH客户端连接到服务器时,双方都会列出连接的参数,即以下 ssh_config 关键字:

  • KexAlgorithms : 用于生成每个连接密钥的密钥交换方式

  • HostkeyAlgorithms : 针对SSH客户端用于接受SSH服务器认证的公钥算法

  • Ciphers : 加密连接的密码

  • MACs : 检测流量篡改的消息认证码

要实现成功连接,上述每个参数的多个可选项中至少有一个选项是双方支持选择的

如果客户端和服务器不能协商连接参数,对于OpenSSH 7.0及以上版本,会出现一个错误消息类似:

Unable to negotiate with legacyhost: no matching key exchange method found.
Their offer: diffie-hellman-group1-sha1

这意味着服务器端采用了默认没有激活的遗留选项,需要通过客户端配置来激活遗留选项,才能顺利访问SSH服务器

上述案例中,客户端和服务器不能协商密钥交换算法,服务器只提供了单一的 diffie-hellman-group1-sha1 方式,虽然OpenSSH支持这种方式,但是由于该算法强度弱且存在Logjam攻击理论可能性,所以OpenSSH默认没有开启支持。

在用户认证过程中有一系列相关选项:

  • PubkeyAcceptedKeyTypes (ssh/sshd) : 公钥算法是客户端发起尝试,由服务器接受的公钥认证(例如,通过 .ssh/authorized_keys 公钥认证)

  • HostbasedKeyTypes (ssh) 和 HostbasedAcceptedKeyTypes (sshd) : 密钥类型由客户端发起尝试,然后由服务器接受基于主机的认证(例如,通过 .rhosts.shosts )

在认证过程中客户端和服务器不匹配会导致认证失败,例如上面的案例就是密钥交换协商失败,此时需要采用:

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 user@legacyhost

或则在 ~/.ssh/config 配置中添加:

Host somehost.example.org
    KexAlgorithms +diffie-hellman-group1-sha1

这里使用了 + 表示不是取代默认的密钥交换算法,而是 附加 。这样只要服务器升级支持更好的加密密钥交换算法就会自动使用更好更强的密钥交换算法。

其他的遗留支持选项还有类似主机认证,可能出现如下提示:

Unable to negotiate with legacyhost: no matching host key type found. Their offer: ssh-dss

OpenSSH 7.0以及更高版本也是默认禁止了 ssh-dss(DSA) 公钥算法,因为这个算法太孱弱,建议不要使用。当然也和上文类似,我们可以临时支持:

ssh -oHostKeyAlgorithms=+ssh-dss user@legacyhost

也有配置方法 ~/.ssh/config

Host somehost.example.org
    HostKeyAlgorithms +ssh-dss

OpenSSH提供命令参数 -Q 可以查询服务器支持的算法:

ssh -Q cipher       # List supported ciphers
ssh -Q mac          # List supported MACs
ssh -Q key          # List supported public key types
ssh -Q kex          # List supported key exchange algorithms

举例:

ssh -Q cipher myserver

可能看到输出:

3des-cbc
aes128-cbc
aes192-cbc
aes256-cbc
aes128-ctr
aes192-ctr
aes256-ctr
aes128-gcm@openssh.com
aes256-gcm@openssh.com
chacha20-poly1305@openssh.com

通过使用 -G 参数可能可以列出所有实际用于连接ssh服务器使用的配置,包括选择的 Ciphers , MACs , HostKeyAlgorithmsKexAlgorithms 参数:

ssh -G user@myserver

参考