SSH 身份验证方法问题

SSH 身份验证方法问题

这些天我研究了 SSH 协议并试图弄清楚密码和公钥认证方法到底是如何工作的。

在密码验证中,我知道客户端使用主机公钥加密凭据,服务器使用其私钥解密。(如果它确实正确)

但是在公钥中,当客户端尝试连接到服务器时,如何进行身份验证以及如何使用此方法防止中间人攻击?

另外,在密码验证中,严格检查是如何进行的?

抱歉,我可能问了一些愚蠢的问题,但我是初学者。

提前致谢。

答案1

在密码验证中,我知道客户端使用主机公钥加密凭据,服务器使用其私钥解密。(如果它确实正确)

不,这不对。服务器的密钥对根本不是用户身份验证过程的一部分——它是在更早的阶段独立验证的。除此之外,两者都不两个密钥对中的一个用于加密任何数据:两个密钥对都仅用于签名。1

相反,SSH 配置加密层在发生其他任何事情之前,并且从该点开始的所有消息(无论是身份验证还是常规数据)都以相同的方式使用该加密。因此,它实际上更类似于通过 HTTPS 发送纯文本密码。

总体流程是:

  1. 密钥交换:
    • 服务器和客户端执行DH 或 ECDH 密钥交换生成会话密钥。
    • 为了避免 MITM 攻击,服务器还使用其主机密钥附加数字签名以及 DH 密钥交换答复。
    • 更多详情RFC 4253 第 8 节
  2. 服务器和客户端开始使用生成的密钥进行对称加密(通常是 AES)。从现在开始,每个数据包都将使用 AES 进行加密。
  3. 用户认证:
    • 如果客户端选择password身份验证,则它只会按原样发送输入的密码,而不进行任何公钥操作。 (密码仍然由通用 SSH 加密层保护。)
    • 如果客户端选择publickey身份验证,它会从服务器收到一个随机“质询”,然后用该质询的数字签名进行回复。服务器验证该签名。
  4. 最后,客户端请求打开一个交互式 shell(或者其他服务)。

1(嗯,从技术上来说并不总是如此——存在使用加密的密钥交换方法,只是在一般实践中从未使用过。

相关内容