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

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

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

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

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

如何判断针对给定连接协商了哪些算法?我使用 -v -v -v 运行了 ssh,看到 kex_parse_kexinit 产生了很多错误。但我无法从这些错误中判断出采用的是哪种算法。

谢谢

答案1

您可以看到各种算法如何协商的更精确细节RFC 4253,第 7.1 节,但基本上:

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

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

debug1: kex: server->client aes128-ctr [email protected] [email protected]
debug1: kex: client->server aes128-ctr [email protected] [email protected]

上次我检查时,OpenSSH 并未说明它选择的具体 Kex 算法。也许这种情况将来会改变。

相关内容