2024年6月7日发(作者:)

SSH建立通道的过程和认证原理

1 $***************.com

在学习SSH原理的过程中,发现阮一峰的 SSH原理与运用(一):

远程登录 对SSH真实的建立通道和认证过程还是讲的有些错误的,所

以我重新查阅了网络资料,对SSH建立连接的过程进行了整理,因此

有了本文。

SSH协议采用C-S(客户端-服务器端)架构进行双方的身份验证

以及数据的加密。服务器端组件监听指定的端口,负责安全连接的建

立、对连接方的身份认证、以及为通过身份认证的用户建立正确的环

境。

一个SSH会话的建立过程分为两个阶段。

第一阶段,双方沟通并同意建立一个加密连接通道以供后续信息

传输用。

第二阶段,对请求接入的用户进行身份验证以确定服务器端是否

要给该用户开放访问权限。

共同建立加密通道

当客户端发起TCP连接时,服务器端返回信息说明自己支持的协

议版本,如果客户端上支持的协议与之匹配,则连接继续。服务器会

提供自己的公共主机密钥(public host key)以让客户端确认自己访

问的是正确的机器。例如你通常第一次与服务器建立SSH连接,会看

到类似这样的提示:

The authenticity of host ' (13.250.177.223)' can't be

1 established.

2 RSA key fingerprint is

3 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.

Are you sure you want to continue connecting (yes/no)?

这是在让你确认服务器的公钥指纹。然后,双方采用一种Diffie-

Hellman算法共同为该会话建立密钥。每一方的一部分私有数据加上

来自对方的一部分公共数据,通过这种算法计算,能够得出完全相同

的密钥用于本次会话。整个会话的通讯内容都使用该密钥进行加密。

(小提示: Diffie-Hellman这个阶段使用的 公钥/私钥对 与后文用户验

证身份阶段所用的SSH密钥是完全无关的)

经典Diffie-Hellman算法的计算步骤如下:

1. 双方共同选择一个大值素数作为种子值(seed value)

2. 双方共同选择一个加密生成器(通常是AES),用于后续的数

值操作

3. 双方分别各自选择一个素数,该素数的值对对方保密,用于生

成本次通讯的私钥(与SSH身份认证私钥无关)

4. 双方分别用各自的私钥、共同的加密生成器、和共同的素数生

成各自的公钥

5. 双方将各自的公钥共享给对方

6. 双方用各自的私钥和对方发过来的公钥生成另一个密钥。根据

该算法,双方各自计算出来的两个密钥是完全一样的,即“共同的秘

密”

7. 该密钥被用于本次通讯所有内容的加密

8. 这个共享密钥的加密方式被称为二进制数据包协议(binary

packet protocol)。该过程能够让双方平等的参与密钥生成的过程,

而不是由单方掌握。这种共享密钥生成的过程是安全的,双方没有交

换过任何未经加密的信息。

最终生成的密钥是 对称式密钥,一方用于加密信息的密钥等同于

另一方用于解密信息的密钥,而任何第三方由于不持有该密钥,是无

法解密双方传递的内容的。

以上 会话加密通道 建立后,SSH才开始进入用户认证阶段

服务器认证用户以开放访问权限

服务器验证用户身份以决定是否准许其访问。验证有不同的方式,

选择的验证方式取决于服务器的支持。

SSH认证有2种方式:

1. 密码验证。服务器要求客户端输入密码,客户端输入的密码经

过上述的通道加密传输给服务器。虽然密码是加密过的,然而该方法