由于HTTP协议存在着明文传输、不能很好的验证通信方的身份和无法验证报文的完整性等一些安全方面的确点,才诞生了HTTPS。严格来时HTTPS不是一种协议而是HTTP + SSL (TSL)的结合体。
1、RSA与AES简述
先来学习一下AES和RSA的相关知识。
1.1、对称加密算法AES
AES全称:Advanced Encryption Standard----高级加密标准,属于对称加密的范畴。该加密算法有一个密钥,该密钥可以用来加密,也可以用来解密。Client端与Server端有一个共同的Key, 这个Key是用来加密和解密的。如果报文在传输的过程中被窃取了,没有这个key, 对加密的内容进行破解是非常困难的,当然窃取者如果有key的话,也是可以轻而易举的解密的。所以在AES中,key是关键。。
为了更安全,每次加密的Key都是从一个密码本中动态生成的,而这个密码本服务端和客户端都有同一本,每次传输的是一些参数。这些参数在经过一些算法的映射,从密码本中取出相应的key用来解密。相当于给AES加了一层防盗门,加大了破解的难度。这样做的好处是每次加密的key都是不同的,但是需要密码本以及映射算法的支持更加耗时。
1.2、不对称加密算法RSA
RAS这个名字,就是该算法三位发明者的名字的首字母的组合。RAS是非对称加密,其在加密和解密的过程中,需要两个Key,一个公钥(public key),一个是私钥(private key)。公钥负责加密,而私钥负责解密。公钥是可以开放出去的,任何人都可以持有公钥进行加密。而私钥要重点保护,因为是用来解密的。
加密和解密就可以用不同的钥匙来处理。对于加密放来说,你尽管可以对报文进行加密,如果没有私有的话也是不可以对你加密的内容进行解密的。你可以把东西放进去,然后再锁上盒子。但是如果你没有钥匙的话,也是打不开这把锁的。
如下图Client内置了一个公钥,该公钥与Server端的私钥是配对的,所以Client端可以使用这个内置的Public key加密,而服务端就可以使用这个private key进行解密。目前最常用的是服务端单向认证机制。
2、第三方公认CA
CA就是第三方公认机构,就像我们在淘宝买商品的时候,支付宝起到监管作用一样,是我们可以信赖的第三方。比如你自己通过RAS算法生成了一个私钥和公钥,在公钥发送给客户端的过程中有可能被篡改成其他的公钥,而客户端在没有其他措施的保护下是不知道该公钥是否就是服务器那边的私钥对应的公钥的,公钥和私钥有可能在公钥分发的过程中被篡改。
所以说颁布一个公正机构来证明是很重要的!在RAS加密中也有一个第三方机构来充当这个角色,负责证明客户端收到的证书就是你发送的证书,中间没有被篡改。这个中间认证机构,就是数组证书认证机构, 其颁发的证书也就是我们常说的CA证书(CA , Certificate Authority)。
流程一般来说是这样的:
第一步:服务端人员使用RSA算法生成两个密钥,一个用来加密一个用来解密。将负责加密的那个密钥公布出去,所以我们称之为公钥(Public Key),而用来解密的那个密钥,不能对外公布,只有服务端持有,所以我们称之为私钥(Private Key)。服务端在将Public Key进行分发证书之前需要向CA机构申请给将要分发的公钥进行数字签名。(服务器公钥负责加密,服务器私钥负责解密)
第二步:生成数字签名公钥证书:对于CA机构来说,其也有两个密钥,我们暂且称之为CA私钥和CA公钥。CA机构将服务端的Public Key作为输入参数将其转换为一个特有的Hash值。然后使用CA私钥将这个Hash值进行加密处理,并与服务端的Public Key绑定在一起,生成数字签名证书。其实数字签名证书的本质就是服务端的公钥+CA私钥加密的Hash值。(CA私钥负责签名,CA公钥负责验证)
第三步:服务器获取到这个已经含有数字签名并带有公钥的证书,将该证书发送给客户端。当客户端收到该公钥数字证书后,会验证其有效性。大部分客户端都会预装CA机构的公钥,也就是CA公钥。客户端使用CA公钥对数字证书上的签名进行验证,这个验证的过程就是使用CA公钥对CA私钥加密的内容进行解密,将解密后的内容与服务端的Public Key所生成的Hash值进行匹配,如果匹配成功,则说明该证书就是相应的服务端发过来的。否则就是非法证书
下图是公钥以及数字签名的具体内容,当对下方公共密钥进行验证时,需要使用内置的CA公钥将数字签名进行解密。然后将解密后的内容,与公钥生成的Hash值进行比较,如果匹配成功,那么该证书就是CA机构颁布的合法证书。
3、HTTPS安全通信机制的建立
接下来就学习一下HTTP+SSL是如何进行数据传输的。
3.1、HTTPS简介
HTTPS不是一个新的通信协议,而是HTTP与SSL(或TSL)的组合。SSL--安全套节层(Secure Socket Layer), TSL(Transport Layer Security 安全传输层)是以SSL为原型开发的协议。HTTPS就是在HTTP与TCP层中间添加了一个SSL层。因为HTTPS被HTTP多了这层加密的流程,所以HTTPS的速度要比HTTP缓慢的多。
3.2、HTTPS的通信过程
SSL的加密过程是RSA与AES混合进行的,也就是通过RSA加密方式来交换AES加解密的密钥,然后使用AES加密的方式来传输报文,也就是简称的握手。下方是图解。
第一步:有客户端发起的第一次握手,此次握手过程的主要目的是从服务端获取数字签名证书,服务端在发送数字签名证书之前要先确认客户端的SSL版本、加密算法等信息。
第二步:完成第一次握手后,接着进行第二次握手。第二次握手是在客户端收到证书后发起的,主要目的是将AES加解密使用的Key (Pre-master secret)发送给服务端。当然这个AES_KEY是使用第一次握手获取的公钥进行加密的。客户端收到这个使用公钥加密后的AES_KEY,使用服务端的私钥进行解密。这样客户端和服务端经过二次握手后都持有了AES加解密的KEY。
第三步:当Client与Server端都持有AES_KEY后,就可以对HTTP报文进行加解密了。
第四步: 最后就是断开连接了。具体如下图所示:
4、总结
HTTP是在不断完善的,HTTPS和加密算法也是在不断更新的,唯一不变的是我们对计算机知识的学习,听首歌再来学习吧!