SSH是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。ssh 协议交互过程如下:
SSH以非对称加密方式实现身份验证:
方法一:是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录。
方法二:是人工生成一对公钥和私钥,通过生成的**对进行认证,这样就可以在不输入密码的情况下登录。任何人都可以自行生成**对,公钥需要放在待访问的计算机之中,而对应的私钥需要由用户自行保管。认证过程基于生成出来的私钥,但整个认证过程中私钥本身不会传输到网络中。
下面就对这两种方法展开介绍:
基于密码的安全验证
客户端知道服务器帐号和密码就可以登录到服务器,并且所有传输的数据都会被加密。具体过程如下:
1、客户端发送登录请求,ssh [email protected]
2、服务端接受请求,将服务端的公钥 ser_rsa.pub 发送给客户端
3、客户端输入密码,密码使用 ser_rsa.pub 加密后发送给服务端(敏感信息安全传输)
4、服务端接受加密后的密码,使用服务端私钥 ser_rsa 解密,匹配认证密码是否合法(如果合法!登录成功)
至此,身份认证通过,然后是交换会话**(对称加密)
5、客户端生成会话数据加密 sess_key,使用 ser_rsa.pub 加密后传输给服务端(会话**)
6、服务端获取到后使用 ser_rsa 解密,得到sess_key
使用会话**对之后传递的数据进行加密,使用对称加密效率高。
7、客户端和服务端通过 sess_key 进行会话数据安全传输
但是,这种认证方式无法避免被“中间人”攻击,可能会有别的服务器在冒充真正的服务器。
如图所示,如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
可以设想,如果攻击者插在用户与远程主机之间,用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。
所以一般在首次登录服务器时,系统会出现下面的提示:
$ ssh [email protected]
The authenticity of host 'host (192.168.100.1)' can't be established.
RSA key fingerprint is 2d:37:16:58:4d:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
确认之后,就可以登录(其实并没有什么用啊?谁会去比对fingerprint~)
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台服务器,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
基于**的安全验证
客户端生成一对**,并将自己的公钥储存在服务器上。登录的时候,服务器会向客户端发送一段随机字符串,客户端用自己的私钥加密后,再发回来。服务器用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录,不再要求密码。如下图所示。
基于**的安全认证简单的描述如上图所示,但在实际传输过程中所有的数据都是需要加密的以保证敏感信息传输安全,即会生成会话**,使用会话**对之后数据进行加密的过程。详细过程如下:
Ac:客户端公钥
Bc:客户端私钥
As:服务器公钥
Bs:服务器私钥
***在认证之前,客户端需要将公钥 Ac 放到服务端上。***
1、客户端发送登录请求,ssh [email protected]
2、服务端接受请求,将服务端的公钥 As 发送给客户端
服务端生成会话ID(session id),设为 p,发送给客户端。
3、客户端生成会话**(session key),设为 q,并计算 r = p xor q。
客户端将 r 用 As 进行加密,结果发送给服务端。
4、服务端用 Bs 进行解密,获得 r。
服务端进行 r xor p 的运算,获得 q。
至此,服务端和客户端都知道了会话**q,以后的传输数据都将被 q 加密。
5、服务端生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
6、客户端使用 Bc 解密 S(x) 得到 x
客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话**
客户端将 n(q+x) 发送给服务器
7、服务器计算 q + x 的 md5 值 m(q+x)
服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功。
至此,服务端和客户端认证通过,可以使用会话**进行加密和解密传输
8、客户端和服务端通过 q 进行会话数据安全传输