与https相比较来讲http存在如下几点不足: 算法
1.不验证通讯方的身份,所以有可能遭遇假装。 segmentfault
2.通讯使用明文(不加密),内容可能会被窃听。 浏览器
3.没法证实报文的完整性,因此有可能已遭篡改。 安全
下面分这三方面来讲明https如何在这三方面有所增强的。服务器
1 通讯方身份:网络
在配置https时,首先咱们应该到CA机构去购买一个ssl证书,咱们来看一下阿里云上购买证书的流程:app
由于证书购买过程是要通过第三方CA(Certificate Authority)机构来进行域名验证,因此这个第三方机构所发的证书是有公信力的。而咱们的浏览器中对于经常使用证书的CA机构是会预先存储一份名单的,好比打开12306官网后点击地址栏前"锁"的标志能够看到:dom
证书的颁发机构为DigiCert,因此浏览器才会认为这是一个受信任的网站。而若是是咱们本身生成的证书,就不会被浏览器识别成可信的网站,仍是会提示用户登陆有风险。当咱们在网站上下载证书的时候,会有两个文件,.key和.pem文件,.key经过编辑器打开能够看到'-----BEGIN RSA PRIVATE KEY-----'的开头,即为RSA非对称加密算法加密的私钥文件,.pem经过编辑器打开能够看到'-----BEGIN CERTIFICATE-----'的开头,即为公钥文件。编辑器
2 通讯方身份:ide
首先,咱们先来看一下https创建链接的过程以下:
上图中省略了TCP的三次握手,在TCP三次握手以后,ssl协议的链接过程大致为:
1.客户端先给服务端发送一个消息,消息内容包括:客户端支持的加密方式,支持的压缩方法,SSL的版本号,客户端生成的随机数,文本内容“Hello”等;
2.服务端接收到消息后,也回发一个Hello,并携带从客户端支持的加密方式中选择的加密方式,服务端生成的随机数,服务端的SSL版本号等信息;
3.随后服务器给客户端发送一个Certificate报文,报文中包含服务端的公钥证书;
4.紧接着服务器给客户端发送Server Hello Done, 表示最初的协商握手过程结束;
5.客户端接收到服务端发送的握手结束的消息后,以Client Key Exchange做为回应,此报文中包含通讯加密过程当中使用的一种被称为Pre-master secret的随机密码串,并使用第三步接收到的公钥证书进行了加密;
6.接着客户端发送Change Cipher Spec报文,该报文告知服务端,此步骤以后的全部数据将使用第五步中生成的master secret进行加密(master secret的生成过程看后面的介绍);
7.随后客户端发送Finish报文,此报文中包含链接至今全部报文的总体校验值,用于完整性验证;
8.服务端接收到客户端发送的Change Cliper Spec报文后,一样以Change Cliper Spec报文做为回应;
9.接着服务端发送Finish报文给客户端,表示服务端已正确解析客户端发送的总体校验值,至此,SSL握手的过程结束。
10.随后开始使用HTTP协议传输使用master secret加密过的数据。
说明:
1.前两步是协商加密算法以及传输各自生成的随机数(为后续生成master secret作准备)的过程;
2.服务端收到客户端发送的Change Cipher Spec(第五步),会使用本身的私钥进行解密,获取报文中的Pre-master secret,这时通讯双方都拥有对方的Random(前两步生成的),Pre-master secret,以及自身的Random, 将三个数做为种子经过算法生成master secret, 用来加密后续Http请求过程当中的数据。其中master secret的生成规则为:
master_secret =
MD5(pre_master_secret + SHA('A' + pre_master_secret +
ClientHello.random + ServerHello.random)) +
MD5(pre_master_secret + SHA('BB' + pre_master_secret +
ClientHello.random + ServerHello.random)) +
MD5(pre_master_secret + SHA('CCC' + pre_master_secret +
ClientHello.random + ServerHello.random));
这里涉及到两种加密方式,加密密钥和解密密钥相同的即为对称加密,不一样的即为非对称加密。在第5步中客户端发送Pre-master secret是经过公钥加密过的,而服务端收到之后要经过私钥来进行解密,因此传送Pre-master secret的过程为非对称加密。然后续传送http消息的过程,服务端和客户端用的都是master_secret进行加密和解密,因此是对称加密。为什么用两种加密方式呢?由于非对称加密安全性要更高,即便***者拿到了公钥,没有私钥的话也没法对加密后的Pre-master secret进行解密。可是非对称加密成本较高,计算量较大比较耗费CPU,因此只对交换Pre-master secret采用了非对称加密,然后续http传输的过程当中,master_secret不会在网络中进行传输,因此能够采用对称加密,成本也较低。
3 完整性
如何实现完整性呢?实现完整性的手段主要是摘要算法。其实经常使用的MD5就是一种摘要算法,MD5可用于从任意长度的字符串建立128位字符串值,最经常使用于验证文件的完整性。而目前最经常使用的摘要算法还有SHA-2(Secure Hash Algorithm 2),他能够生成22四、25六、384或512位的哈希值来验证文件完整性。可是SHA-2毕竟是一种基于明文的加密方式,仍是不够安全。在通讯中咱们仍是须要经过MAC来验证信息的完整性,它是经过MAC算法从消息和密钥生成,能够检测到消息内容的更改,来保护数据完整性。HMAC是MAC更进一步的扩展,它是使用MAC值+Hash值的组合方式,计算中可使用任意长度的Hash函数。
参考:
https://segmentfault.com/a/1190000022012971
https://juejin.im/post/6844903602494898183
《图解HTTP》