前端开发,移动开发,后台开发,都应该知道HTTP通信,而且现在一些大厂都已经使用HTTPS进行通信,那HTTPS到底是什么呢,有什么好处呢?
一.为什么要使用HTTPS
http是一种通信上极为简便的协议,他本身不带有安全功能,http包在网络上传输的过程中难免会被人窃听,篡改甚至拦截。有时候一些比较隐私的数据比如个人账号密码身份证号码,银行卡账号密码,是绝对不能被人知道的,那这个时候该怎么办呢?所以这个时候就出现了HTTPS,他不是一种新的协议,是在HTTP和TCP层之间添加了一个SSL层,也就是把HTTP的包,经过加密后,再发给TCP传输出去。
二.简单介绍HTTPS的主要功能
1.身份认证
HTTPS具备身份认证功能,也就是客户端和服务端在相互通信的时候,需要互相认证身份(有时候只需要认证服务端身份),才可以建立连接,保证了双方身份的有效性。
2.加密通信
把HTTP的报文,主要是报文主体部分,经过对称加密,把密文部分拿去传输,保证了通信的数据主体不会被泄漏(因为就算被监听到了,拿到的也是密文,没有密钥是无法破解的)
3.数据完整性
三.HTTPS建立连接的9次握手及WireShark抓包分析
1.简单介绍WireShark抓包使用方法
首先打开WireShark后双击这里Wi-Fi:en0,就会进入监听页面
通过这个图可以清晰得看到每个请求的Time, Sourece(请求端IP), Destination(接收端IP), Protocol(协议类型), Length, Info。这里我说清晰的看到,其实也是昧着良心说的,哪里清晰了,数据一大堆,我请求了一个HTTP请求完全就是石沉大海了,根本找不到嘛。所以最重要的其实还是要会使用过滤器。
先介绍几种过滤器的常用方法:
1.过滤协议类型
比如我只想看到HTTP请求,就在过滤栏中输入http那就只看到http相关的请求了。
然后这里有一个小技巧,HTTP一般是成对出现的, 也就是请求和响应,所以当你点击某一个数据的时候,在最左边,会出现向右的箭头和向左的箭头,这个就是一对请求和响应,这里是因为请求和响应都在一起,所以看起来没那么重要,但是当请求和响应集中爆发的时候,就可以看出他的作用了。
2.根据请求和响应的IP地址来过滤
比如我只想要发给IP为61.151.234.53的请求和响应,那就在过滤栏中输入“ip.src == 172.28.104.232 and ip.dst == 61.151.234.53”,这样就把其他的数据都过来掉了。
然后要查看这些请求的具体报文,就可以点击具体一条看下面的数据
这里可以看到,Internet Protocol(也就是IP协议,网络层)Transmission Control Protocol(TCP协议,传输层) Hypertext Transfer Protocol(HTTP协议,应用层)我们最关系的当然是HTTP层了,可以在这里看到URI Method及各个Header。
2.HTTPS实现原理简介
1.要使用HTTPS进行通信的服务端,需要向CA机构申请数字证书,来证明自己身份的有效性。
2.当客户端请求的时候,把证书发给客户端,客户端验证证书有效,也就是认证了服务端的有效性,并且拿出数字证书中包含的公钥
3.客户端生成一个随机数,使用公钥加密,并且传递给服务端
4.服务端用私钥解密,拿到随机数。之后客户端和服务端就用这个随机数进行加密通信
小结:HTTPS最关键的就是使用数字证书来证明服务器的有效性,然后使用非对称加密来传递对称加密的密钥。这里要说明的是,实际使用中对称加密的密钥,并不是直接由客户端生成的随机数,这里为了说明方便而简单这样理解。实际上的对称加密密钥是要根据协商的加密算法组件来决定的。
3.祭出一张《图解HTTP》中关于HTTPS握手的流程图以及对应的WireShark抓包
这里我们主要观察ssl,所以添加了ssl过滤,以及添加了目标IP地址过滤。这里可以看到,上下两图,是基本可以对应上的。
1.Client Hello
这是客户端发送请求给服务端
在这里可以看到,SSL使用的版本是TLSv1.2,然后这里发送了一个客户端生成的随机数Random,这个在后面会使用到,然后还有Cipher Suites这个是客户端支持的加密算法组件,客户端把这个加密算法组件发给服务端,服务端会从里面选出一个最适合的组件来进行加密通信。
2.Server Hello
这里可以看到,服务端也返回了一个Random给客户端,并且把选中的加密算法组件发送给客户端
3.Certificate
这一步是服务端把数字证书发给客户端
证书中包含了服务端非对称加密的公钥,客户端验证通过后会取出来,用作后续加密使用
4.Server Key Exchange Serve Hello Done
这一步中的Server Key Exchange是《图解HTTP》流程图中缺少的,这一步也是根据具体算法组件决定的,这里采用了DH算法,所以需要服务端传递参数到客户端。
Server Hello Done就是告诉客户端这一阶段结束了。
5.Clinet Key Exchange, Change Cipher Spec, Multiple Handshake Messages
Clinet Key Exchange是客户端生成随机数作为pre-master-secret,然后使用刚才从证书中拿到的公钥进行加密,然后传递给服务端。
Change Cipher Spec是客户端告诉服务端,以后的消息都是通过加密后的
Multiple Handshake Messages是告诉服务端,这一阶段结束了,并且在这一过程中,通过客户端Random, 服务端Random和pre-master-secret生成了master-secret来作为之后通信对称加密的密钥。
6.Change Cipher Spec Handshake Message
Change Cipher Spec是服务端告诉客户端,之后的通信是通过加密后的通信。
Handshake Message在这个过程中,服务端也通过客户端Random, 服务端Random和pre-master-secret生成了master-secret来作为之后通信对称加密的密钥。
7.ApplicationData
到了这里,SSL的握手连接算是完成了,这里就是试着完成一次HTTP通信,发送的数据,也是经过密钥加密的。在此之后的所有通信都是通过密钥加密的。直到断开连接,下次通信又需要以上握手连接。