HTTP(HyperText Transfer Protocol,超文本传输协议)被用于在Web浏览器和网站服务器之间传递信息,在TCP/IP中处于应用层。这里提一下TCP/IP的分层共分为四层:应用层、传输层、网络层、数据链路层; 分层的目的是:分层可以解耦,动态替换层内协议算法
应用层:向用户提供应用服务时的通信活动(ftp,dns,http)
传输层:网络链接中两台计算机的数据传输(tcp、udp)
网络层:处理网络上流动的数据包,经过怎样的传输路径把数据包传送给对方(ip)
数据链路层:与硬件相关的网卡、设备驱动等等浏览器
这样,HTTPS就登场了。HTTPS中的S表示SSL或者TLS,就是在原HTTP的基础上加上一层用于数据加密、解密、身份认证的安全层,即安全
加密相关的预备知识:对称加密和非对称加密。服务器
对称加密 : 加密和解密数据使用同一个密钥。这种加密方式的特色是速度很快,常见对称加密的算法有 AES;网络
非对称加密: 加密和解密使用不一样的密钥,这两个密钥造成有且仅有惟一的配对,叫公钥和私钥。数据用公钥加密后必须用私钥解密,数据用私钥加密后必须用公钥解密。通常来讲私钥本身保留好,把公钥公开给别人(通常公钥不会单独出现,而是会写进证书中),让别人拿本身的公钥加密数据后发给本身,这样只有本身才能解密。 这种加密方式的特色是速度慢,CPU 开销大,常见非对称加密算法有 RSA。架构
CA证书的相关知识: CA证书是由CA(Certification Authority)机构发布的数字证书。其内容包含:电子签证机关的信息、公钥用户信息、公钥、签名和有效期。这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,而后采用CA的私钥对信息摘要进行加密,加密完的密文就是签名。 即:证书 = 公钥 + 签名 +申请者和颁发者的信息。 客户端中由于在操做系统中就预置了CA的公钥,因此支持解密签名(由于签名使用CA的私钥加密的)tcp
有了这些预备知识后,就能够来看看HTTPS是如何怎么作到安全认证的。函数
先来看看单向认证的过程:工具
从上图能够看出,服务端拥有一对非对称密钥:B_公钥和B_私钥。详细过程以下:
(1)客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。网站
(2)服务端去CA机构申请来一份CA证书,在前面提过,证书里面有服务端公钥和签名。将CA证书发送给客户端
(3)客户端读取CA证书的明文信息,采用相同的hash散列函数计算获得信息摘要(hash目的:验证防止内容被修改),而后用操做系统带的CA的公钥去解密签名(由于签名是用CA的私钥加密的),对比证书中的信息摘要。若是一致,则证实证书是可信的,而后取出了服务端公钥
(4)客户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数造成密文,发送给服务端。
(5)服务端用本身的B_私钥去解密这个密文,获得了密钥F
(6)服务端和客户端在后续通信过程当中就使用这个密钥F进行通讯了。和以前的非对称加密不一样,这里开始就是一种对称加密的方式
双向认证和单向认证原理基本差很少,单向认证客户端须要认证服务端,而在双向认证中增长了服务端对客户端的认证
(1)客户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
(2)服务端去CA机构申请来一份CA证书,在前面提过,证书里面有服务端公钥和签名。将CA证书发送给客户端
(3)客户端读取CA证书的明文信息,采用相同的hash散列函数计算获得信息摘要(hash目的:验证防止内容被修改),而后用操做系统带的CA的公钥去解密签名(由于签名是用CA的私钥加密的),对比证书中的信息摘要。若是一致,则证实证书是可信的,而后取出了服务端公钥
(4)客户端发送本身的客户端证书给服务端,证书里面有客户端的公钥:C_公钥
(5)客户端发送支持的对称加密方案给服务端,供其选择
(6)服务端选择完加密方案后,用刚才获得的C_公钥去加密选好的加密方案
(7)客户端用本身的C_私钥去解密选好的加密方案,客户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数造成密文,发送给服务端。
(8)服务端和客户端在后续通信过程当中就使用这个密钥F进行通讯了。和以前的非对称加密不一样,这里开始就是一种对称加密的方式
HTTPS在保证数据安全传输上使用对称加密和非对称加密相结合的方式来进行的,简单来讲就是经过一次非对称加密算法进行了最终通讯密钥的生成、确认和交换,而后在后续的通讯过程当中使用最终通讯密钥进行对称加密通讯。之因此不是全程非对称加密,是由于非对称加密的计算量大,影响通讯效率。
HTTPS即便安全,也是可以被抓包的,常见的抓包工具备:Charles、fildder等。
经常使用的HTTPS抓包方式是做为中间人,对客户端假装成服务端,对服务端假装成客户端。简单来讲:
具体过程以下图所示:
为了防止中间人攻击,可使用SSL-Pinning的技术来反抓包。 能够发现中间人攻击的要点的伪造了一个假的服务端证书给了客户端,客户端误觉得真。解决思路就是,客户端也预置一份服务端的证书,比较一下就知道真假了。
SSL-pinning有两种方式: 证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。
在逆向界,一山更比一山高。 思路是这样的:内置证书或者公钥的时候,经常会有对比验证的函数,直接控制这个函数的返回结果让验证经过不就行了吗。 因而就有了一个突破SLL-Pinning的经典操做:采用Xposed+justTrustme模块。 这个方案使用的是JustTrustMe这个Xposed模块,它所作的事情就是将各类已知的的HTTP请求库中用于校验证书的API都进行Hook,使不管是不是可信证书的状况,校验结果返回都为正常状态,从而实现绕过证书检查的效果
查看我主页