「SSH」- 原理简述

  CREATED BY JENKINSBOT

在整个通讯过程中,为实现 SSH 的安全连接,Client 与 Sever 要经历如下五个阶段:   
1)版本协商阶段:目前 SSH 包括 SSH1 和 SSH2 两个版本,双方通过版本协商确定使用的版本;
2)算法协商阶段:SSH 支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的加密算法;
3)密钥交换阶段:通过密钥交换算法生成会话密钥,此后双方的会话均通过会话密钥加密;
4)用户认证阶段:SSH Client 向 Server 发起认证请求, Server 对 Client 进行认证;   
5)会话交互阶段:当认证通过后,Server 和 Client 进行信息的交互;

版本协商阶段

客户端和服务器交互 SSH 版本协商报文,确定 V1 或 V2 版本

1)服务端打开端口 22,等待客户连接。客户端向服务端发起 TCP 连接,双方完成握手并建立连接。
3)客户端向服务端发送第一个报文,包括版本标志字符串,格式为 “协议版本号 次协议版本号 软件版本号”。
4)服务端收到报文后,解析协议版本号:如果客户端的协议版本号比自己的低,且服务端能支持客户端的低版本,就使用客户端的协议号,否则使用自己的协议版本号。

算法协商阶段

客户端和服务器交互自己支持的算法列表,该列表包括四种算法的具体算法名称。

算法协商过程为:
1)从客户端发来的算法列表取出第一个算法,服务器在自身的算法列表中查找,若匹配上相同的算法,则协商成功,继续协商下一种算法;否则继续从客户端的该种算法列表中取出下一个算法,在服务器端的算法列表中匹配,直到匹配成功。

密钥交换阶段

根据密钥交换算法,双方动态地产生会话密钥用于后续会话加密。会话密钥无法被第三者截获,安全可靠。

客户端和服务器首先约定两个公开的质数p和g。
客户端和服务器各自随机产生一个数Xc,Xs,作为自己的私钥。
各自计算出自己的公钥Yc,Ys。
交换公钥Yc,Ys。
根据公私钥计算出加密用的会话密钥。

具体的密钥交换算法为DH算法,DH算法基于数学的离散对数(不再详述)。在密钥交换过程中私钥Xc,Xs始终是保密不传播的,且由于离散对数计算的困难性,其他用户即使获取 p、g、Yc、Ys 也无法推断出私钥 Xc、Xs,从而保证了会话密钥的安全性。

注意,该阶段产生的公私钥仅用于产生会话密钥,与后续用户认证无关。密钥交换阶段完成后,后续所有报文交互均为会话密钥加密过的报文。

用户认证阶段

用户认证阶段有口令认证和公钥认证两种方式。

口令认证

客户端发送携带用户名和口令的认证请求,服务器与本地用户数据进行匹配认证。

公钥认证

客户端发送携带数字签名的认证请求,服务器通过公钥解密数字签名进行认证。

会话交互阶段

当用户完成认证后,客户端向服务器发起建立通道请求,进行数据传输。

通道类型包括会话通道,x11通道,转发的tcp-ip通道,非转发的(直连的)tcp-ip通道。
更多参考 RFC4250 4.9.1. Connection Protocol Channel Types 小节,https://www.ietf.org/rfc/rfc4250.txt