1.HTTP协议本身存在的缺点:
(1)明文传输、不能很好的验证通信方的身份
(2)无法验证报文的完整性等
2.HTTPS确切的的说不是一种协议,而是HTTP + SSL (TSL)的结合体
(1)HTTP报文经过SSL层加密后交付给TCP层进行传输
(2)SSL(安全套节层)主要采取的是RSA(非对称加密)与AES(对称加密)结合的加密方式
(3)先通过RSA交互AES的密钥,然后通过AES进行报文加密和解密
3.RSA与AES简述
(1)Advanced Encryption Standard (AES: 高级加密标准)
<1>该加密算法有一个密钥,该密钥可以用来加密,也可以用来解密,所以AES是对称加密算法
<2>Client端与Server端有一个共同的Key, 这个Key是用来加密和解密的
<3>若报文在传输的过程中被窃取了,无这个key, 对加密的内容进行破解是非常困难的
<4>当窃取者有key的话,是可以轻而易举的解密的,所以在AES中,key是关键
<5>相当于家的门钥匙,谁拿到钥匙后都可以打开家的门,即使门锁再结实,再安全,在钥匙面前也是不行
<6>为了加大破解Key的难度,每次加密的Key都是从一个密码本中动态生成
(2)RSA 公钥加密算法
<1>RAS这个名字,就是该算法三位发明者的名字的首字母的组合
<2>RAS是非对称加密,其在加密和解密的过程中,需要两个Key,一个公钥,一个是私钥
2.1.公钥负责加密,而私钥负责解密
2.2.公钥是可以开放出去的,任何人都可以持有公钥进行加密
2.3.私钥必须得进行保护,因为是用来解密的
<3>目前最常用的是服务端单向认证机制
4.CA证书
(1)通过RAS算法生成了一个私钥和公钥,在公钥发送给客户端的过程中有可能被篡改成其他的公钥
(2)客户端在没有其他措施的保护下是不知道该公钥是否就是服务器那边的私钥对应的公钥的
(3)为了防止公钥被篡改,需要一个第三方认证机构
<1>数组证书认证机构, 其颁发的证书也就是常说的CA证书
<2>来证明生成的公钥就是正版而非伪公钥
(4)CA证书的证书签名,证书分发以及证书验证流程
<1>服务端人员使用RSA算法生成两个密钥,一个用来加密一个用来解密
1.1.将负责加密的那个密钥公布出去,称之为公钥(Public Key)
1.2.用来解密的那个密钥,不能对外公布,只有服务端持有,称之为私钥(Private Key)
<2>服务端在将公钥进行分发证书之前需要向CA机构申请给将要分发的公钥进行数字签名
<3>生成数字签名公钥证书:
3.1.对于CA机构来说,其也有两个密钥,暂且称之为CA私钥和CA公钥
3.2.CA机构将服务端的Public Key作为输入参数将其转换为一个特有的Hash值
3.3.使用CA私钥将这个Hash值进行加密处理,并与服务端的公钥绑定在一起,生成数字签名证书
3.4.数字签名证书的本质就是服务端的公钥+CA私钥加密的Hash值
3.5.CA私钥负责签名,CA公钥负责验证
<4>服务器获取到这个已经含有数字签名并带有公钥的证书,将该证书发送给客户端
4.1.当客户端收到该公钥数字证书后,会验证其有效性
4.2.客户端使用CA公钥对数字证书上的签名进行验证
4.3.这个验证的过程就是使用CA公钥对CA私钥加密的内容进行解密
4.4.将解密后的内容与服务端的公钥所生成的Hash值进行匹配
4.4.1.如果匹配成功,则说明该证书就是相应的服务端发过来的
4.4.2.否则就是非法证书
5.HTTPS安全通信机制的建立
(1)HTTPS简介
<1>HTTPS不是一个新的通信协议,而是HTTP与SSL(或TSL)的组合
1.1.SSL–安全套节层, TSL-安全传输层是以SSL为原型开发的协议
1.2.IETF以SSL3.0为基准后又制定了TLS1.0、TLS1.1和TLS1.2
1.3.当前主流版本为SSL3.0与TLS1.0
<2>HTTPS就是在HTTP与TCP层中间添加了一个SSL层
<3>因为HTTPS被HTTP多了这层加密的流程,所以HTTPS的速度要比HTTP慢的多
6.HTTPS的通信过程
(1)SSL的加密过程是RSA与AES混合进行的
(2)下方是SSL建立连接以及传输数据的过程大体可以分为四步
<1>有客户端发起的第一次握手,此次握手过程的主要目的是从服务端获取数字签名证书
1.1.服务端在发送数字签名证书之前要先确认客户端的SSL版本、加密算法等信息
<2>第二次握手是在客户端收到证书后发起的
2.1.主要目的是将AES加解密使用的Key (Pre-master secret)发送给服务端
2.2.这个AES_KEY是使用第一次握手获取的公钥进行加密的
2.3.客户端收到这个使用公钥加密后的AES_KEY,使用服务端的私钥进行解密
2.4.这样客户端和服务端经过二次握手后都持有了AES加解密的KEY
<3>当Client与Server端都持有AES_KEY后,就可以对HTTP报文进行加解密了
<4> 最后就是断开连接了