7.1. Algorithm Negotiation (算法协商)
7.1. Algorithm Negotiation (算法协商)
密钥交换通过双方发送以下数据包开始:
byte SSH_MSG_KEXINIT
byte[16] cookie (随机字节)
name-list kex_algorithms
name-list server_host_key_algorithms
name-list encryption_algorithms_client_to_server
name-list encryption_algorithms_server_to_client
name-list mac_algorithms_client_to_server
name-list mac_algorithms_server_to_client
name-list compression_algorithms_client_to_server
name-list compression_algorithms_server_to_client
name-list languages_client_to_server
name-list languages_server_to_client
boolean first_kex_packet_follows
uint32 0 (为将来扩展保留)
每个算法名称列表必须是以逗号分隔的算法名称列表.每个支持 (允许) 的算法必须按优先级从高到低的顺序列出.
每个名称列表中的第一个算法必须是首选 (猜测的) 算法.每个名称列表必须至少包含一个算法名称.
算法选择过程: 遍历客户端的算法列表, 逐个选择第一个同时满足服务器支持且符合密钥类型要求的算法.如果找不到满足所有条件的算法, 连接失败, 双方必须断开连接.
在发送 SSH_MSG_KEXINIT 消息后, 直到发送 SSH_MSG_NEWKEYS 消息 (第 7.3 节) 之前, 除了以下消息外, 不得发送任何其他消息:
- 传输层通用消息 (1 到 19) (但不得发送 SSH_MSG_SERVICE_REQUEST 和 SSH_MSG_SERVICE_ACCEPT)
- 算法协商消息 (20 到 29) (但不得发送进一步的 SSH_MSG_KEXINIT 消息)
- 特定密钥交换方法消息 (30 到 49)