SSH Handshake Explained

version exchange

key exchange

key exchange initialization

双方发送 SSH_MSG_KEX_INIT 消息,交换加密组件(cryptographic primitives)信息。

ECDH 为例:客户端先生成临时密钥对,通过一个 SSH_MSG_KEX_ECDH_INIT 信息发送给 server。

server 收到 SSH_MSG_KEY_ECDH_INIT 之后,生成自己的临时密钥对。在用 client 的公钥和它自己的密钥对生成 secret K 和 exchage hash H。 见下图。

Generation of the exchange hash H

在生成 exchage hash 的签名 HS,会用 server 私钥签名。最后,将 server 的公钥、临时生成的 KEX 公钥和 HS 通过 SSH_MSG_KEX_ECDH_REPLY 发给 client。 见下图。

Generation of the ECDH KEX reply.

client 接收到 SSH_MSG_KEX_ECDH_REPLY 之后,就可以计算 K 和 H 了。