一文读懂HTTPS的实现原理​

207 阅读6分钟

​        为了获得更高的安全性,https使用的越来越多。你知道https对数据进行加密,但是有了加密就安全了吗?https是如何对数据进行加密的?运用了什么算法?什么是中间人攻击?中间人攻击和https有什么关系?对于以上灵魂拷问,你未必答的上来。

下面的文章将层层升入,带你解读上面的问题,搞懂https的本质原理

一、数据加密

        https相较于http的优势在于数据加密,保证了数据在传输过程中的安全性。那么https是怎么对数据进行加密的呢?我们知道加密算法分成对称加密和非对称加密,我们先来解释一下何为对称加密和非对称加密

1、对称加密

即加密和解密使用同一个密钥,如AES。这种算法的优势是效率高,加解密速度快,但是密钥传输困难。

2、非对称加密

使用公私钥机制,用公钥对数据加密,私钥解密,通过公钥加密的数据只有私钥可以解密,如RSA。这种算法的优势是密钥传输简单,只需要保管好私钥,公钥可以任意传播。但是这种算法也存在加解密效率低,耗时长的问题。

3、密钥交换

为了即保证效率又便于传输,我们可以结合对称加密和非对称加密的优势,设计一种折中的方案,我们假设A要向B传输一段数据,其过程可概括如下:

3.1、B创建公私钥对

3.2、B将自己的公钥发送给A

3.3、A生成用于计算对称加密秘钥的随机数,并计算对称加密密钥

3.4、A通过公钥对随机数进行加密,并将密文传输给B

3.5、B通过私钥对密文解密,获得随机数,并计算对称加密密钥

3.6、A、B完成密钥交换,可通过对称加密算法进行数据传输

https使用了上面的密钥交换方案,A是通信中的客户端,B是通信中的服务端。

二、新的问题

        这样看起来似乎很完美,但是足够安全吗?非也。让我们继续看下面的问题。

例1、中间人攻击

如上图,客户端(C)请求服务器(S),但由于某些原因发生了DNS劫持,S的域名在经过域名解析后解析成了错误的IP,即图中的MITM(M),导致后续所有请求都将发往M。M构造自己的公私钥对,将公钥发给C,C生成随机数通过公钥加密发给M,M通过私钥解密,这时M就获得了可以和C正常通信的秘钥。M再以正常身份和S建立连接,将C的请求转发给S,这样所有的数据都暴露给M,这就是我们常说的中间人攻击。

例2、钓鱼网站

举个例子,你在输入知乎的域名www.zhihu.com时,如果错误的打成了zihu.com,同时有些人出于恶意的目的做了一个和知乎一模一样的网站,并申请了zihu.com的域名。这个时候你完全察觉不到到,其实你访问的并不是真正的知乎,你的数据都将暴露给恶意网站。如果这种情况发生在金融领域,将造成更大的损失。

三、解决方案

        针对上面的问题,我们还需要一种机制来验证服务器的身份,就好像我们的身份证一样,以确定我们正在访问的服务器是真实可信的,这种方案使用了数字签名技术。

3.1、数字签名

        使用公私钥机制,用私钥对数据进行加密,公钥解密,如果能获得一致的明文,那么这段信息就是合法的,否则就是篡改或者冒充的。这里不难看出,数字签名和非对称加密刚好是相反的,非对称加密使用公钥加密,私钥解密。因为使用私钥加密,别人无法获得你的私钥,这样就无法生成你的签名信息,这样就可以验证这段数据确实是你发送的,并且没有经过篡改,更不可能是伪造的。

三、CA证书

        CA证书是由CA(Certificate Authority)机构颁发的证明,它包含了公钥、公钥拥有者名称(签发对象)、数字签名、有效期、授权中心名称(签发者)、证书序列号等信息。数字证书是个人或企业在网络上的身份证,它把上面说到的加密和签名整合到了一起。

1、证书是如何签发的?

1.1、通过非对称加密算法生成一对公私钥。

1.2、生成证书基本信息,包括签发者ID,签发对象,有效期,证书序列号等

1.3、将第一步生成的公钥和第二部生成的证书基本信息(简称P),通过hash算法生成hash值H,然后使用签发机构的私钥(注意:这里是签发机构的私钥,不是第一步生成的私钥)对H进行加密,得到签名信息S,这个步骤称为签名。然后将P,S连成一个文件,这个文件就是所谓的数字证书了。所以完整的数字证书,至少应该包括证书持有者的身份信息,证书信息,证书持有人的公钥,以及用于校验证书合法性防止被冒充的签名信息。

2、客户端是怎么校验证书合法性的?

前面我们我们已经知道,证书合法性是通过证书签名来保证的,客户端在获取到服务端的CA证书后,会拿到其中的签名信息和签发机构ID,从本机的可信任证书列表中拿到签发机构的公钥,通过公钥对签名信息进行解密得到hash值H1,同时,计算明文的hash值H2,H1和H2如果相等,则说明证书合法,如果不相等,则证书不合法,因为其他组织没有签发机构的私钥,不可能生成签名信息

四、https的请求过程

        下面,我们对https的请求过程进行一个完整的总结。任何启用了https的网站都需要向CA权威机构申请证书,证书是CA机构颁发给网站的身份凭证,网站的真实可靠由CA机构的信用担保。权威的CA机构数量是有限的,浏览器只会信任几家具有资质的权威机构颁发的证书,通过校验证书的数字签名来确保证书是否合法。如果合法,则通过密钥交换流程,进行密钥交换,不合法则提示告警

1、证书验证

1.1、浏览器向服务器发起https请求

1.2、服务器返回https证书

1.3、浏览器校验https证书是否合法,如果不合法则提示告警

2、数据传输

以下数据传输的过程是在证书校验合法的前提下

2.1、客户端在本地生成随机数

2.2、通过第一步获取的公钥对随机数进行加密

2.3、服务端通过私钥对随机数进行解密,服务端获取到随机数

2.4、客户端和服务端通过随机数计算密钥,完成密钥交换,正常通信