应用层的HTTP作了什么事?git
通常会用到如下的关键信息:github
请求的地址、请求方式(GET、POST等),Header信息有什么(Accept类型,User-Agent信息等), 请求的参数如何封装,状态码表示什么含义,cookie如何处理,DNS怎么请求等等。算法
以上内容均不在本文的讨论环节中,请自行了解。安全
HTTP的不足之处主要在于安全性,有如下几点:服务器
Charles是一个很是常见的抓包工具,经过进行代理,使计算机交互的网络请求经过它进行中转,记录和显示全部发送和接收的数据。 开发常常用它能够作什么事?cookie
若是只用http,有什么方式能够对第三方有必定的防范?网络
直接对交互内容进行加密。 对请求的内容或者返回的内容进行加密,须要服务端与客户端同时具有加密与解密功能,在每次发送消息,接受消息的时候都进行加密解密,这样就算被截取,也没法被识别,可是报文首部仍是不能被加密。工具
HTTP的基本认证机制 对于某些涉及到敏感信息的请求,会设定一个安全域,一旦进行返回便会返回401 Unanthorized,而且要求用户输入帐号与密码,在客户端进行base64加密后发送给服务端。在被窃听以后被加密以后的消息依然会被截取,若是被窃听方保存,仍然能够再一次发送给服务端,获取信任。ui
MD5校验文件加密
HTTPS 就是在安全的传输层上发送的 HTTP。HTTPS 在将 HTTP 报文发送给 TCP 以前,先将其发送给了一个安全层,对其进行加密。
HTTP 安全层是经过 SSL 及其现代替代协议 TLS 来实现的。咱们遵循常见的用法,用术语 SSL 来表示 SSL 或者 TLS。
发送已加密的 HTTP 报文以前,客户端和服务器要进行一次 SSL 握手,在这个握手过程当中,它们要完成如下工做:
在了解这个握手过程以前,须要了解对称加密与非对称加密的概念。
服务端与客户端用相同的密钥对消息加密,这样就算攻击者劫持到了中间的消息,仍是破解不了。
可是会有两个问题:
若是要让对方得到同样的密钥,总不能经过http的方式告诉对方,须要经过其余的路径。 每个客户端使用的密钥必须得不同,如何管理这么多的密钥。
客户端保存私钥,服务端接受来自客户端的公钥。
虽然公钥是能够在网上公开的,可是黑客截取到了用公钥加密的数据,没有私钥仍是不能打开。
能够解决一大部分问题了,可是仍是有缺点:
可是黑客也能够模拟客户端发送数据,由于它也有公钥。
若是公钥被偷偷替换了,也没法证实是不是真的公钥。
非对称加密的算法比对称加密效率要低很多。
证书就是为了解决这个问题诞生的。
证书中包含不少信息,主要有:
HTTPS通讯请求详细步骤:
步骤1:客户端经过发送ClientHello报文开始SSL通讯。报文中包含客户端支持的SSL的指定版本、加密组件(CipherSuite)列表(所使用的加密算法及密钥长度等)。
步骤2:服务器可进行SSL通讯时,会以ServerHello报文做为应答。和客户端同样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。
步骤3:以后服务器发送Certificate报文。报文中包含公开密钥证书。
步骤4:最后服务器发送ServerHelloDone报文通知客户端,最初阶段的SSL握手协商部分结束。
步骤5:SSL第一次握手结束以后,客户端以ClientKeyExchange报文做为回应。报文中包含通讯加密中使用的一种被称为Premastersecret的随机密码串。该报文已用步骤3中的公开密钥进行加密。
步骤6:接着客户端继续发送ChangeCipherSpec报文。该报文会提示服务器,在此报文以后的通讯会采用Premastersecret密钥加密。
步骤7:客户端发送Finished报文。该报文包含链接至今所有报文的总体校验值。此次握手协商是否可以成功,要以服务器是否可以正确解密该报文做为断定标准。
步骤8:服务器一样发送ChangeCipherSpec报文。
步骤9:服务器一样发送Finished报文。
步骤10:服务器和客户端的Finished报文交换完毕以后,SSL链接就算创建完成。固然,通讯会受到SSL的保护。今后处开始进行应用层协议的通讯,即发送HTTP请求。
步骤11:应用层协议通讯,即发送HTTP响应。
步骤12:最后由客户端断开链接。断开链接时,发送close_notify报文。上图作了一些省略,这步以后再发送TCPFIN报文来关闭与TCP的通讯。
既然HTTPS比HTTP好,为何不一直用HTTPS?
回到Charles这个话题,为何Charles能抓HTTP的请求?
由于Charles在服务端与客户端作了一层代理。
为何HTTPS的请求也能截取?
还记得在截取HTTPS请求的时候,须要作什么么?
具体步骤:
客户端向服务器发起HTTPS请求
Charles拦截客户端的请求,假装成客户端向服务器进行请求
服务器向“客户端”(其实是Charles)返回服务器的CA证书
Charles拦截服务器的响应,获取服务器证书公钥,而后本身制做一张证书,将服务器证书替换后发送给客户端。(这一步,Charles拿到了服务器证书的公钥)
客户端接收到“服务器”(其实是Charles)的证书后,生成一个对称密钥,用Charles的公钥加密,发送给“服务器”(Charles)
Charles拦截客户端的响应,用本身的私钥解密对称密钥,而后用服务器证书公钥加密,发送给服务器。(这一步,Charles拿到了对称密钥)
服务器用本身的私钥解密对称密钥,向“客户端”(Charles)发送响应
Charles拦截服务器的响应,替换成本身的证书后发送给客户端
至此,链接创建,Charles拿到了 服务器证书的公钥 和 客户端与服务器协商的对称密钥,以后就能够解密或者修改加密的报文了。
这里最关键的一步就是须要客户端信任Charles证书,这也是为何不要安装来历不明的盗版系统的缘由之一。