简介:


SSH(Secure+SHell):是一种网络协议,顾名思义,就是非常安全的shell,主要用于计算机间的加密传输。

SSH服务基于非对称加密(public-key cryptograthy也称公开密钥加密)技术实现数据加密传输。该技术会生成一对密钥,一个对数据进行加密,而且只能用于加密,而另一个只能用于解密。使用加密密钥加密后的数据,只能用对应的解密密钥才能解密。而且只知道其中一个密钥,无法计算出另一个。因此,如果公开了一对密钥中的一个,并不会危害到另一个密钥。通常把公开的密钥称为公钥(public key,不公开的密钥称为私钥(private key

**如果公开的是解密密钥,该场景用于客户端验证持有私钥一方发布的数据或文件的完整性,准确性,以防数据被篡改。

**如果公开的是加密密钥,该场景用于客户给给私钥所有者上传数据,称为公开密钥加密。

当前,SSH主要采用RSA算法(协议V2默认算法)和DSA算法(协议V1仅支持该算法)来实现非对称加密技术。

 

SSH提供两种方式的登陆验证:

1>密码(口令)验证:以服务器中本地系统用户的登陆名称,密码进行验证。

2>密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户机中创建一对密钥文件(公钥和私钥),将公钥文件放到服务器中的指定位置。

***当密码验证和密钥对验证都启用时,服务器将优先启用密钥对验证***

 

SSH协议的基本框架

 

SSH协议框架中最主要的部分是三个协议:传输层协议、用户认证协议和连接协议。同时,SSH协议框架中还为许多高层的网络安全应用协议提供扩展的支持.

传输层协议(The Transport Layer Protocol)提供服务器认证,数据机密性,信息完整性等的支持。用户认证协议(The User Authentication Protocol)为服务器提供客户端的身份鉴别。连接协议(The Connection Protocol)将加密的信息隧道复用成若干个逻辑隧道,提供给更高层的应用协议使用。各种高层应用协议可以相对的独立于SSH基本体系之外,并依靠这个基本框架,通过连接协议使用SSH的安全机制。

 

SSH连接及交互过程:

 

当服务端SSH服务正常运行后,客户端连接时,进行如下交互:

 

1,客户端向服务端发送连接请求。

###客户端通过SSH 工具连接服务端,相关信息通过明文发送。

 

2,服务端返回公钥信息。

###根据客户端所使用的服务协议版本及算法设置,返回相应公钥信息。比如,默认情况下,客户端通过SSH V2版协议,基于RSA算法建立连接,则服务器端将*/ras_key.pub文件中的内容返回客户端。相关信息通过明文发送。

 

3,客户端对服务端公钥进行比对和确认。

###客户端接受到服务端公钥信息后,会进行如下比对,并让用户对相关信息进行确认:

a,如果是首次连接服务端,客户端会收到如下信息,让用户确认公钥指纹(注释)的有效性:

The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc.

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

**如果输入no,则连接中断并报错(Host key verification failed

)。

**如果输入yes,则会将相应的公钥信息保存到当前用户家目录下.ssh目录内的known_hosts文件中。

b,如果之前已经成功连接,而且公钥指纹比对一致,则会继续进行下一步操作。

c,如果服务端因重装系统等因素导致公钥指纹发生变化,则会直接导致连接失败(报错Host key verification failed),则需要删除已保存的条目后再重新连接。

 

4,客户端生成临时密钥对。

###服务端公钥校验及确认后,客户端会生成一对临时密钥用于客户端加密。该密钥对不会存储到文件,而是记录在内存中。每次连接都会生成临时密钥对。

 

5,客户端发送公钥信息。

###客户端向服务端发送前述生成的临时密钥对中的公钥信息。相关信息通过明文发送。

 

至此,服务端及客户端都拥有对方的公钥和自身的私钥,所以称为非对称加密

 

公钥指纹:

由于公钥一般较长(采用RSA算法 时长达1024位),所以为了方便起见,通过对其MD5计算,生成一个128位的字符串用于信息比对。此称为公钥指纹。


后续登陆校验及正常的数据传输,都会通过双向加密方式进行:

a,如果服务端需要发送数据给客户端:

   ->服务端使用所持有的客户端公钥,对需要传输的数据进行加密再发送给客户端。

   ->客户端收到信息后,使用所持有的自身私钥解密后获得数据。

b,如果客户端需要发送数据给服务端:

同上流程,身份互换。