随着谷歌浏览器对https证书的大力推行,几乎所有大型网站都部署了https证书,我们在开发时,也时常会用到https,比如开发微信小程序,微信官方要求小程序内部发送异步请求必须是https协议。

 

https好处多多,用https协议传输信息,信息的安全性会得到保障,用http传递信息几乎等于裸奔了,如图所示:

 

白话https加密原理_服务器端

 

https在传输信息的时候是需要对信息进行加密的。https用到的加密方式有两种,分别是对称加密和非对称加密,首先咱们看一下对称加密的图解:

 

白话https加密原理_客户端_02

 

对称加密有个特点,端点两端的秘钥是一样的,不能被第三方知道。

但是大家仔细观察,对称加密有个缺点,那就是就是秘钥如何交换。这句话的意思是指,客户端如何把秘钥交给服务端,或者服务端如何把秘钥交给客户端,但是不能被第三方知道,因为第三方也得到了这个秘钥,那么信息就不安全了。

 

因为只有客户端和服务端都知道秘钥才能实现加密解密,如果只有客户端或者只有服务端其中一方持有秘钥,是不能完成加密解密整个过程的。

 

那么这个问题如何解决呢?先搁置一边,下面看一下非对称加密。

 

非对称加密需要两把不同的秘钥,这点和对称加密不同,分别是一把私钥,一把公钥,并且这两把钥匙是配对的。公钥私钥有如下几个特性:

 

1、公钥加密必须使用与其匹配的私钥才能解密

2、私钥加密必须使用与其匹配的公钥才能解密

3、私钥必须严格保密,不能泄露,非对称加密建立在私钥严格保密的基础上。

4、公钥可以随意分发给任何人。

 

非对称加密相较于对称加密,主要的作用是弥补了对称加密秘钥分发的问题。

 

我们用一张图来演示一下非对称加密:

 

白话https加密原理_对称加密_03

 

从图中我们可以看到,非对称加密的公钥可以随意分发给任何人,私钥必须自己保存,不能交给别人,在信息进行交互的时候,我们只要用公钥加密私钥解密,或者私钥加密公钥解密即可。

 

上面的方案看上去很美,但是有两个非常大的漏洞无法解决:

1、公私钥加密解密是非常耗时的,而web的用户体验不允许我们直接使用公私钥加密

2、公钥的分发是个问题,假如服务器端将公钥作为响应发送给客户端,但是这个过程被一个中间人劫持了,然后中间人假装服务器,给客户端发送了一个假的公钥,客户端并不知道中间人的存在,使用假的公钥加密信息,中间人拿到后用和假公钥匹配的私钥解密,信息就泄露了,过程如图:

 

白话https加密原理_服务器端_04

 

观察图中的中间人,中间人劫持了真的公钥,自己生成一对公私钥,用这对公私钥和客户端沟通交流,完全以假乱真。

 

我们可以将对称加密和非对称加密结合起来使用,用非对称加密方式来交换对称加密用的秘钥,然后用对称加密的秘钥来加密交互信息。

 

这里还有一点大家需要注意,https的加密必须借助第三方来实现,也就是CA证书,为什么需要这个东西呢?

 

因为我们将公钥分发出去的时候为了防止被中间人替换或者窃取,需要对公钥做特殊处理,这个特殊处理通常就是加密,但是加密后,加密的秘钥如何给到客户端呢?这就形成了一个无限的死循环,所以需要引入第三方机构,CA证书机构。

 

大家的操作系统和浏览器都内置了各大权威证书的公钥也就是CA的公钥,简而言之就是我们的操作系统内置CA的公钥,我们要做的就是去这些机构申请我们的公钥证书,这个证书是被和CA的公钥匹配的CA私钥加密过的。

 

当客户端和服务器端进行通信的时候,服务器端将公钥证书发送给客户端,客户端拿到证书,用系统和浏览器内置的权威CA公钥解密验证证书,得到服务器的公钥。

 

然后用服务器公钥加密对称秘钥发送到服务器端,服务器用服务器自己的私钥解密得到对称秘钥,这样就可以用对称秘钥进行数据交换了。

 

流程图如下:

 

白话https加密原理_非对称加密_05

 

仔细观察上面这张图:

第一步、客户端发送请求,服务器将证书发送给客户端,证书的本质是第三方CA的私钥加密的内容,其内容是服务器的公钥。

第二步、客户端接收到证书后,用操作系统和浏览器内置的CA公钥去匹配验证证书,如果能解密,说明网站安全

第三步、用CA公钥解密证书,并将服务器公钥解密出来。到这一步,客户端安全的拿到了服务器端的公钥。

第四步、生成随机数,用服务器公钥加密随机数发送到服务器端。

第五步、服务器端用服务器私钥解密信息,得到随机数

 

剩下的步骤,客户端和服务器端都有了相同的随机数,也就是有了相同的对称秘钥,就可以安全通信了。

 

以上就是https的基本原理,当然这里讲解的比较简单,有些东西忽略掉了,比方说证书的加密方式与其内容加密等等。

 

在这里我再给大家总结一下:

 

1、服务器端必须生成自己的私钥和公钥,我们称其为服务器公钥服务器私钥。客户端不用生成公私钥。

2、https除了服务器端的公私钥参与,还有一对公私钥,CA公钥CA私钥

CA公钥内置在客户端系统里面,CA私钥呢?仔细阅读下面一条。

服务器端用服务器私钥去CA机构申请证书,CA机构用CA私钥加密服务器公钥(先暂时这样理解)。这样的话,客户端系统内置的CA公钥就可以从证书中解密出服务器公钥了。并且CA机构的私钥只有CA机构知道。

3、客户端用解密出的服务器公钥加密随机生成的对称秘钥发送给服务器端,这样客户端和服务器端就有相同的对称秘钥了,并且第三方不可能知道。从而实现加密通信。

 

从上文我们可以看出,我们的操作系统是内置了各大权威CA的公钥的,如果安装了盗版的或者来路不明的操作系统,就算访问https网站,也有裸奔的风险。