OpenSSH 是如何协商密码、MAC 和密钥交换算法的?

Anr*_*nro 7 encryption ssh openssh

查看 sshd_config 的手册页,我看到了密码、密钥交换 (KEX) 和 MAC 的默认算法列表。在我的设置中,我选择了这些算法的一个子集来使用(即我不想允许旧算法或弱算法)。我想知道的;协商算法的顺序是什么?

我知道客户端和服务器必须就使用哪种算法达成一致。但是该列表是否需要从最喜欢的 -> 最不喜欢的顺序排列?或者反过来?手册页中的列表似乎首先按算法组排序,首选组在前,但在每个组中,算法似乎从最不喜欢到最喜欢排序。

基本上,我的问题归结为,客户端和服务器会协商他们都支持的“最强”算法(其中“最强”是在 OpenSSH 内部定义的),还是会在(服务器和客户端)中选择第一个/最新的算法支持的算法列表?

如何判断为给定连接协商了哪些算法?我已经用 -v -v -v 运行了 ssh,我看到 kex_parse_kexinit 有很多溢出。但是我无法从那次喷涌中判断出采用哪种算法。

谢谢

jjl*_*lin 1

您可以在RFC 4253 第 7.1 节中查看有关如何协商各种算法的更精确的详细信息,但基本上:

  • ssh_config中(或用户的~/.ssh/config)和 中的算法sshd_config按偏好从高到低排列。
  • 服务器选择客户端列表中它也支持的第一个算法。因此,选择偏向于客户的偏好。

密码和 MAC 算法确实显示在详细输出中,例如

debug1: kex: server->client aes128-ctr umac-64@openssh.com zlib@openssh.com
debug1: kex: client->server aes128-ctr umac-64@openssh.com zlib@openssh.com
Run Code Online (Sandbox Code Playgroud)

最后我检查了一下,OpenSSH 并没有说明它选择的确切 Kex 算法。也许这种情况将来会改变。