http与https认识
注:OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 应用层:应用层为应用程序提供访问网络服务的接口,为用户直接提供各种网络服务。常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别 会话层:负责建立、管理和终止表示层实体之间的通信会话。 传输层:为上层协议提供端到端的可靠或者不可靠的数据传输服务。传输单位为数据段segment;协议有:TCP、UDP 网络层:通过IP寻址来建立两个节点之间的连接(解决网络路由和寻址问题)。协议有: IP、ARP、ICMP,传输单位是数据包packet 数据链路层:接受来自物理层的位流形式的数据,并封装成帧,传送到上一层;同样,也将来自上一层的数据帧,拆装为位流形式的数据转发到物理层;并且还负责处理接受端发回的确认帧的信息,以便提供可靠的数据传输。(传输单位为帧frame)MAC属于本层 物理层:利用传输介质为数据链路层提供物理连接,实现相邻计算机节点之间比特流的透明传输,尽可能屏蔽掉具体传输介质与物理设备的差异。网卡、集线器在物理层(数据传输单位bit)
一、http,https介绍
1.http
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,默认端口号80;常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法
http传输面临的风险: 窃听风险:可以拦截获取通信内容。 篡改风险:可以修改通信内容。 冒充风险:可以冒充他人身份参与通信
如何理解HTTP协议是无状态的?
协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态;例如:同一个电脑开的的网页和上一次打开的这个网页之间是没有任何联系的
2.https
基于 TCP 来传输(所谓的“HTTPS 即 HTTP over TLS”,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)
HTTPS协议承载于TLS或SSL协议层之上,HTTPS的端口号为443
什么是SSL/TLS
SSL是Secure Sockets Layer的缩写,中文叫做“安全套接层”
TLS是Transport Layer Security”的缩写,中文叫做“传输层安全协议”
SSL是指安全套接层协议(以及传输层协议TLS),位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。
https有什么特点?使用有什么好处?
1.防流量劫持
全站Https是根治运营商、中间人流量劫持的解决方案,不仅可以杜绝网页中被插入的小广告,更可以保护用户隐私安全。
2.提升搜索排名
采用Https可以帮忙搜索排名的提升,提高站点的可信度和品牌形象。
3.杜绝钓鱼网站
Https地址栏安全标志可以帮助用户识别出钓鱼网站,保障用户和企业的利益不受损害,增强用户信任。
https的趋势
1.Google 已调整搜索引擎算法,让采用 HTTPS 的网站在搜索中排名更靠前;
2.从 2017 年开始,Chrome 浏览器已把采用 HTTP 协议的网站标记为不安全网站;
3.苹果要求 2017 年 App Store 中的所有应用都必须使用 HTTPS 加密连接;(xcode7以上无法使用http带域名进行请求)
4.当前国内炒的很火热的微信小程序也要求必须使用 HTTPS 协议;
5.新一代的 HTTP/2 协议的支持需以 HTTPS 为基础。
全网 HTTPS 势在必行。
https工作流程
注:CA:证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构。是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。 1.客户端向服务器发起HTTPS请求,连接到服务器的443端口。 2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。 3.服务器将自己的SSL证书发送给客户端。(证书包含:证书发布机构CA、证书有效期、公钥、证书所有者、签名......) 4.客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性。如果公钥合格,那么客户端会生成一个随机值, 这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。 5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。 6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。 7.然后服务器将加密后的密文发送给客户端。 8.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
注:
- 对称加密,就是加密和解密都是用同一个秘钥,这种方式优点就是速度快,缺点就是在管理和分配秘钥的时候不安全。常见算法DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等 对称加密在线测试:http://www.jsons.cn/textencrypt/
- 非对称加密算法,非对称加密有一个秘钥对,叫做公钥和私钥,私钥自己持有,公钥可以公开的发送给使用的人。使用公钥进行加密的信息,只有和其配对的私钥可以解开。目前常见的非对称加密算法是RSA,非对称的加密算法的优点是安全,因为他不需要把私钥暴露出去。
- 在线生成公私钥:http://web.chacuo.net/netrsakeypair/ 共钥加密:http://tool.chacuo.net/cryptrsapubkey 私钥解密:http://tool.chacuo.net/cryptrsaprikey
https抓包原理
-
客户端向服务器发起HTTPS请求
-
Charles拦截客户端的请求,伪装成客户端向服务器进行请求
-
服务器向“客户端”(实际上是Charles)返回服务器的CA证书
-
Charles拦截服务器的响应,获取服务器证书公钥,然后自己制作一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
-
客户端接收到“服务器”(实际上是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
-
Charles拦截客户端的响应,用自己的私钥解密对称密钥,然后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
-
服务器用自己的私钥解密对称密钥,向“客户端”(Charles)发送响应
-
Charles拦截服务器的响应,替换成自己的证书后发送给客户端
-
至此,连接建立,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,之后就可以解密或者修改加密的报文了。
HTTPS抓包的原理还是挺简单的,简单来说,就是Charles作为“中间人代理”,拿到了 服务器证书公钥 和 HTTPS连接的对称密钥,前提是客户端选择信任并安装Charles的CA证书,否则客户端就会“报警”并中止连接。这样看来,HTTPS还是很安全的。
那么客户端为什么这么容易被骗呢?客户端主要通过下面三种方式来校验证书的合法性:
- 查看证书是否过期
- 服务器证书上的域名是否和服务器的实际域名相匹配
- 校验证书链
市面上大量的应用在证书检验方面做的都不够,还有很多的应用完全末做验证。而即使是完整的校验了整个证书链体系,中间人攻击同样还是可以通过在终端上手动添加信任根证书的方式发动。
这也正是Charles/Fiddler等抓包软件在抓取HTTPS协议数据前,要求在终端上安装证书的原因。这个证书可以确保伪造的证书通过客户端的证书链校验。
ssl-pinning
那么是如何做到防止Charles/Fiddler等抓包工具中间人攻击的呢?它是在开发时就将服务端证书一块打包到客户端里。这样在HTTPS建立时与服务端返回的证书比对一致性,进而识别出中间人攻击后直接在客户端侧中止连接。
突破ssl-pinning
有矛就有盾,开发者已经突破了ssl-pinning的限制达成了抓包需求。其实现的基本原理很简单,客户端不是会做两个证书间的一次性校验吗,那么就通过hook的方式将此次校验的结果返回true或者干脆不让其做校验。当然这种做法只能在越狱环境下实现,但对于抓包来说,这已经足够了。
目前应用层绕过ssl的方案有:xposed+justTrustMe frida+DroidSSLUnpinning
同样的,有攻有防,目前抖音17版本以上已经实现了将ssl-pinning验证集合到了so中,目前能解决的只有hook so相关方法进行绕过,偏麻烦复杂
http扩展知识:长短链接
HTTP 对 TCP 使用方式分2种:
短链接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。双方任意都可以发起close操作,不过一般都是client(客户)先发起close操作。
长链接(“Keep-Alive”或“Persistent Connection”): 网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接
长短链接优缺点
短链接:
优:管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段
缺:客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽
长链接:
优:长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间
缺:客户端连接越来越多,server压力会越大,客户端一般不会主动关闭
如何设置长链接,以及链接有效时间?
在header中设置:Connection:keep-alive 和Keep-Alive: timeout=60 (空闲时间超过60秒,自动失效,如果在58秒请求时重新计时)
只设置Connection:keep-alive 表明链接永久有效
connection字段只有服务端设置才有效。