Https、ssh加密原理

1. Https与Http区别

相比于Http,Https采用了加密传输方式,可以有效防止网络攻击。可以近似理解为Https = Http + SSL证书。

Http默认端口为8080,Https默认端口为443。

2. Https加密原理

Https加密原理

  1. 客户端(浏览器)向服务端发起请求
  2. 服务端接收请求,并明文传输公钥A给客户端,为了证实服务端的身份,服务端会将CA证书一同传输给客户端(这个步骤是与ssh建立连接的区别所在)
  3. 客户端接收到公钥A,并用公钥A加密自己本地随机生成的对称加密密钥X
  4. 公钥A加密的信息只有通过私钥才能解密,因此只有服务端才能解密并获取对称密钥X
  5. 至此,服务端和客户端双方都持有对称密钥X,且第三方无法窃取,此后通过密钥X加密传输数据

3. SSH加密原理

SSH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

SSH加密原理与https基本相同,唯一的区别在于ssh没有CA证书,容易收到中间人攻击(Man-in-the-middle attack)。客户端无法验证公钥有没有被篡改过,如果有人截取数据,并返回篡改后的假公钥给客户端,客户端通过假公钥加密后的密码信息被截取并解密,就会导致客户端密码信息泄漏。

  • 下图展示了SSH被攻击的情况

ssh被攻击

问题在于客户端无法验证公钥A是不是来自服务端真实的公钥,Https采用CA证书来验证服务端的身份,而SSH则没有。

4. SSH解决中间人攻击的办法

SSH的publish key和private key都是自己生成的,没法公证。只能通过Client端自己对公钥进行确认。

通常在第一次登录的时候,系统会出现下面提示信息:

1
2
3
4
$ ssh user@host
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?

上面信息的意思是:无法确认主机host(12.18.429.21)的真实性,不过知道它的公钥指纹,询问你是否继续连接?

所谓”公钥指纹”,是指公钥长度较长(这里采用RSA算法,长达1024位),很难比对,所以对其进行MD5计算,将它变成一个128位的指纹。上例中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d,再进行比较,就容易多了。

之所以用fingerprint代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。

很自然的一个问题就是,用户怎么知道远程主机的公钥指纹应该是多少?

回答是没有好办法,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对,或者自己甄别host地址是否正确。

假定经过风险衡量以后(一般用户直接就选择yes吧),用户决定接受这个远程主机的公钥。
  Are you sure you want to continue connecting (yes/no)? yes
系统会出现一句提示,表示host主机已经得到认可。
  Warning: Permanently added ‘host,12.18.429.21’ (RSA) to the list of known hosts.
然后,会要求输入密码。
  Password: (enter password)
如果密码正确,就可以登录了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
每个SSH用户都有自己的known_hosts文件,此外系统也有一个这样的文件,通常是/etc/ssh/ssh_known_hosts,保存一些对所有用户都可信赖的远程主机的公钥。