我需要了解SSH密钥交换,我试图阅读RFC文件,但它似乎很难理解,所以我已经捕获使用wireshark数据包,我发现各种数据包的SSH密钥交换
SSHv2 Client: Key Exchange Init SSHv2 Server: Key Exchange Init SSHv2 Client: Diffie-Hellman Key Exchange Init SSHv2 Server: Diffie-Hellman Key Exchange Reply SSHv2 Client: Diffie-Hellman GEX Init SSHv2 Server: Diffie-Hellman GEX Reply SSHv2 Client: New Keys
任何人都可以详细解释我的每个数据包或ssh密钥交换序列?
首先你应该理解Diffie-Hellman交换的概念。 它允许在两个端点之间build立一个具有以下特征的通道:
它生成的随机数不能由两个同伴单独确定,而是两个一起确定。 对我来说这是一个有趣的概念。
从维基百科文章这里是交换的简化结构:
结果他们产生了一个安全的随机秘密g ab 。
现在为了获取WIRESHARK!
SSHv2客户端:密钥交换初始化
几个参数协商,如压缩和一些encryptionalgorithm。
SSHv2服务器:密钥交换初始化
回复以上
SSHv2客户端:Diffie-Hellman密钥交换初始化
有关math小组的DH参数的协商。 (有关更多详细信息,请参阅RFC4419第3节)。
SSHv2服务器:Diffie-Hellman密钥交换答复
回复以上。
SSHv2客户端:Diffie-Hellman GEX Init
DH的第一次实际交stream。 维基百科符号后,这将是第2步(爱丽丝发送克)。
SSHv2服务器:Diffie-Hellman GEX回复
交换结束(Bob发送g b )。
在接收到这个数据包之后,双方都知道秘密密钥(g ab ),并build立一个伪安全信道(可以防止随意窃听,但不能抵抗中间人攻击)。
SSHv2客户端:新密钥
这看起来像一个简单的确认消息给我。 它很小,不包含有意义的数据。
好吧,我想在这之后还有很多事情要做(服务器公钥validation,用户authentication,为shell / sftp / scp / tunnelsbuild立数据通道等)。 我不知道确切的细节,并(幸运)所有这一切都是encryption的。
有用的参考:
客户端和服务器首先向对方发送他们正在使用的协议和软件版本。
SSHv2 Client: Key Exchange Init
这里,客户端按照优先级的顺序告诉服务器它支持的每个function的algorithm(encryption,MAC,密钥交换,主机authentication,压缩)。
SSHv2 Server: Key Exchange Init
服务器也一样。 请注意,它可以在收到来自客户端的消息之前发送此消息。
从这两个algorithm列表中,客户端和服务器独立计算相同的密码套件。 例如,他们select相同的kex交换algorithm(并在此之后发生)。
SSHv2 Client: Diffie-Hellman Key Exchange Init SSHv2 Server: Diffie-Hellman Key Exchange Reply SSHv2 Client: Diffie-Hellman GEX Init SSHv2 Server: Diffie-Hellman GEX Reply
Diffie-Hellman密钥交换使得客户端和服务器能够以networking上的观察者不可能猜到的共享秘密结束。 例如,他们将从这个秘密中获得encryptionalgorithm的密钥。
请注意,服务器的答复还包含其公共主机密钥(或证书)。 如果是公钥并且客户端从来没有见过,那么客户端通常会询问用户是否应该信任它:
主机'debian.org(130.89.148.14)'的真实性无法build立。
ED25519密钥指纹是SHA256:bNnjFMvzsNhkwzRHwGRbTIUM4XzUjlLrBl / 7MzCbndw。
SSHv2 Client: New Keys
用新钥匙信息,客户意味着:
嘿服务器! 以下所有来自我的消息都将使用我们刚才协商的密码。
服务器还必须向客户端发送一个新的密钥消息。
我的主要参考是SSH传输协议RFC: https : //tools.ietf.org/html/rfc4253 。 这是SSH的最底层,所有其他的SSH服务(用户authentication,shell,X11转发等)都是基于这个服务的。