HTTP
什么是HTTP?
http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。
-
HTTP协议规定了双方可以实现的操作,例如GET、POST、PUT、DELETE…,通过这些操作客户端可以对服务端的资源进行获取以及修改等;
-
HTTP协议还规定了客户端向服务端请求的方式,必须以http或者https为开头,比如https://www.baidu.com/,这样服务端才能识别这是一个HTTP请求,并且读取该请求执行响应操作;第三HTTP协议还规定了如何在URL中获取指定资源,比如我要查看服务器中的某个页面,https://www.baidu.com/通过这样http://ip:port/path/…的方式实现对服务器中某个资源的获取。
-
HTTP协议也规定了双方的响应消息以及状态码,可以理解为服务端执行了客户端的请求得到响应结果,服务器将响应结果返回给客户端,客户端收到响应结果,可以解析响应结果然后展示。响应结果中又包含了具体数据以及状态码等信息。状态码平时使用的比如200、404、400、500等都是一种状态码的规约,客户端可以根据这些状态码判断客户端收到请求后的执行状态,是否成功,以及是否异常等信息。
浏览器请求数据的过程
- 浏览器解析URL:浏览器中通过DNS服务器将输入的域名解析成计算机网络中可以识别的IP地址。
- 封装HTTP数据包:HTTP数据包由请求行、请求头部、空行和请求数据四部分组成。
- 封装TCP数据包:在传输层需要对数据进行封装TCP首部,在TCP首部中包含了要发送给服务器的各种信息,比如源端口、目睹端口、确认号、顺序号等等。
- 建立TCP连接:建立连接的过程,通过三次握手实现客户端与服务端的连接。
- 客户端发送请求:数据封装了,连接建立了,客户端可以发送请求了,这时客户端发送自己的HTTP请求了,因为彼此已经建立连接了所以客户端发送请求,服务端也可以收到请求。
- 服务端响应:根据客户端请求,服务端操作之后将响应数据返回给客户端,响应数据包含客户端想要的数据以及状态码。
- 客户端接收响应消息执行渲染
- 服务器关闭TCP连接
HTTPS
什么是HTTPS?
Https = Http + SSL
SSL协议:SSL(Secure Socket Layer)安全套接层,是一种位于应用层与传输层之间,为网络通信提供安全及完整性验证的一种网络协议。
相对于TCP或HTTP协议,SSL协议要复杂很多。由于它也是建立在TCP协议之上的,所以在使用SSL传输数据之前需要先进行三次握手和服务器建立连接。
HTTPS在HTTP基础上加入SSL协议,SSL协议依靠证书来验证服务器的身份,并对传输的数据进行加密,保障数据的安全性。这个过程大致为:发送HTTPS请求、得到返回证书、对证书验证、密钥交换、数据传输。
为什么需要HTTPS呢
HTTP协议的缺点
- 通信使用明文:通信使用明文意味着安全性大大降低,当通信过程被窃听后,无需花费额外的投入就可看到传输的数据。例如使用抓包工具,无需任何配置就可查看任何使用HTTP协议的通信数据;
- 不验证通信方的身份:不验证通信方的身份,将导致通信过程被窃听后,可能会遭遇伪装,例如使用抓包工具抓取数据后,就可按照数据包的格式构造HTTP请求;
- 无法验证报文的完整性:不验证报文的完整性,数据在传输过程中就可能被篡改,本来想看喜洋洋呢,结果数据在传输过程中被换成了光头强。
SSL协议的握手过程
- 客户端先给服务端发送一个消息,消息内容包括:客户端支持的加密方式,支持的压缩方法,SSL的版本号,客户端生成的随机数,文本内容等;
- 服务端接收到消息后,也回发一个消息,并携带从客户端支持的加密方式中选择的加密方式,服务端生成的随机数,服务端的SSL版本号等信息;
- 随后服务器给客户端发送一个Certificate报文,报文中包含服务端的公钥证书;
- 紧接着服务器给客户端发送Server Hello Done, 表示最初的协商握手过程结束;
- 客户端接收到服务端发送的握手结束的消息后,以Client Key Exchange作为回应,此报文中包含通信加密过程中使用的一种被称为Pre-master secret的随机密码串,并使用第三步接收到的公钥证书进行了加密;
- 接着客户端发送Change Cipher Spec报文,该报文告知服务端,此步骤之后的所有数据将使用第五步中生成的master secret进行加密;
- 随后客户端发送Finish报文,此报文中包含连接至今所有报文的整体校验值,用于完整性验证;
- 服务端接收到客户端发送的Change Cliper Spec报文后,同样以Change Cliper Spec报文作为回应;
- 接着服务端发送Finish报文给客户端,表示服务端已正确解析客户端发送的整体校验值,至此,SSL握手的过程结束。
- 随后开始使用HTTP协议传输使用master secret加密过的数据。
HTTPS的实现原理
1、证书验证阶段
- 浏览器发起 HTTPS 请求
- 服务端返回 HTTPS 证书
- 客户端验证证书是否合法,如果不合法则提示告警
2、当证书验证合法后,在本地生成随机数
- 通过公钥加密随机数,并把加密后的随机数传输到服务端
- 服务端通过私钥对随机数进行解密
- 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输
https加密过程
- 客户端发出请求 (带有支持的协议,随机数,支持的加密方法)
- 服务端响应 (服务器数字证书(公钥,hash算法,加密算法,过期时间…), 随机数,确认加密方法,确定通信协议)
- 客户端获取到数字证书,客户端验证是否合法. 然后生成对称密钥,通过服务器公钥进行加密然后发送给服务端
- 服务端通过私钥解密获得对称密钥
注意:https的握手本质上可以说交换对称密钥的过程. 其中用到数字签名(数字证书要进行数字签名),非对称加密(服务器公钥加密解密)和对称加密(握手完成之后的通过对称密钥对数据的加密解密)
为什么数据传输是用对称加密?
1、非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的;
2、在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以 HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。
数字签名
数字签名,就是验证自身身份的一种方式。
数字签名由签名和验证组成. 发送者持有签名(私钥),接收者持有(公钥)来验证其身份。
数字签名是由数字摘要算法和非对称加密算法组成。例如https的数字签名,就是先对服务器数字证书进行数字摘要(hash-1),然后通过私钥对生成的数字摘要(hash-1)进行加密发送给客户端。客户端通过公钥解密得到hash-1然后通过hash算法对获取到的数字证书进行数字摘要得到(hash-2).判断hash-1与hash-2是否相同就可以知道数字证书是否被劫持和篡改了。
HTTP vs HTTPS
HTTP特点:
- 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
- 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
- 基于请求和响应:基本的特性,由客户端发起请求,服务端响应
简单快速、灵活 - 通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
HTTPS特点:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改