http

HTTP 1.1

特点

  • 长连接,默认不关闭,可以被多个请求复用
  • 并发连接,允许对一个域名的请求分配多个TCP连接,缓解了队首阻塞问题
  • 增加了PUT、DELETE、OPTIONS、TRACE、CONNECT等方法
  • 增加了缓存字段,允许缓存代理服务器缓存数据,if-modified-since、if-none-match、cache-control等字段
  • 允许数据分块传输,使用chunked编码
  • 强制要求Host字段,让服务器可以再统一IP和端口上使用不同主机名来创建虚拟主机
  • pipeline,允许客户端在一个TCP内发送多个请求,不用等待服务器响应。但服务器要按照接收到的顺序返回响应

头位文本,数据可以是文本也可以是二进制

HTTP 2.0

特点

  • 二进制协议,不再是文本协议
  • 分帧传输,一个完整的HTTP请求或响应被分成多个帧,每个帧都是一个二进制数据块,可以乱序发送,根据帧头部的流标识符重新组装
  • 多路复用,允许多个请求同时在一个TCP连接上进行
  • 首部压缩,减少了首部字段的大小。使用HPACK算法,在两端维护索引表,用来记录已经发送的首部字段,后续发送相同的首部字段时,只需要发送索引号
  • 服务器推送,服务器会顺便把一些客户端需要的资源一起推送到客户端,避免客户端再次创建连接发送请求到服务器端获取

HTTPS

HTTP问题,明文传输,没有用户验证,不保证数据完整性
HTTPS提供了加密,数据一致性,身份认证

HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS协议位于TCP/IP协议与HTTP协议之间,为HTTP协议提供了加密、解密、身份认证等安全功能。

SSL两层

  • SSL记录协议:建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持
  • SSL握手协议:建立在SSL记录协议之上,用于在客户端和服务器之间建立SSL连接

HTTPS 协议是由SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中不被窃取、修改,确保数据的完整性。

HTTP与HTTPS的连接方式不同,端口也不同,HTTP端口用的是80,HTTPS端口用的是443。
HTTPS协议需要申请证书,一般免费的证书很少。
HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近。
HTTPS 协议的加密范围也比较有限。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。

对称加密,比如DES、AES等,加密和解密使用相同的密钥,速度快,但是密钥传输不安全
非对称加密,比如RSA、DSA等,加密和解密使用不同的密钥,公钥加密,私钥解密,速度慢,但是公钥可以公开

TLS结合了对称加密和非对称加密的优点,使用非对称加密来交换对称加密的密钥,然后使用对称加密来传输数据

存在中间人伪造公钥的问题,因此需要CA证书,CA证书是由CA机构颁发的,用来证明公钥的合法性
存在中间人修改数据的问题,因此要保证完整性

摘要算法

摘要算法可以实现完整性,是一种单向加密算法,它能够将任意长度的数据转换为固定长度的摘要,且不同的数据产生的摘要是不同的。常见的摘要算法有MD5、SHA-1、SHA-256等。
在发送时,发送方将数据和摘要一起发送,接收方收到数据后,重新计算摘要,如果两个摘要不一样,说明数据被修改过。
但是这样还是无法防止中间人攻击,因为中间人可以修改数据和摘要,然后重新计算摘要,然后发送给接收方,因此需要数字签名

数字签名

使用私钥对摘要进行加密,就能实现数字签名,接收方使用公钥解密摘要,然后重新计算摘要,如果两个摘要一样,说明数据没有被修改过,验证了消息确实是发送方发送的。

看似已经解决了中间人攻击,但是还是有一个问题,就是如何保证公钥的合法性,如果中间人伪造了公钥,那么接收方就会使用中间人的公钥解密摘要,然后重新计算摘要,验证通过,但是数据已经被中间人修改过了。

CA

CA证书是由CA机构颁发的,用来证明公钥的合法性,CA证书包含了公钥、数字签名、证书有效期等信息,
存在信任链,根证书是自签名的,然后用根证书签发中级证书,中级证书签发终端证书,终端证书签发用户证书。

操作系统和浏览器都内置了各大 CA 的根证书,上网的时候只要服务器发过来它的证书,就可以验证证书里的签名,顺着证书链(Certificate Chain)一层层地验证,直到找到根证书,就能够确定证书是可信的,从而里面的公钥也是可信的。

数字签名的制作过程:
CA机构拥有非对称加密的私钥和公钥。
CA机构对证书明文数据T进行hash。
对hash后的值用私钥加密,得到数字签名S。

明文和数字签名共同组成了数字证书

TLS 四次握手

TCP连接建立后,客户端和服务器端需要进行TLS握手,TLS握手过程如下:

  1. 浏览器发送ClientHello消息,告诉服务器自己支持的加密算法、协议版本号以及一个随机数
  2. 服务器收到ClientHello消息后,发送ServerHello消息,告诉浏览器自己选择的加密算法、对照的协议版本号以及一个随机数。还包括服务器的证书,公钥和数字签名
  3. 浏览器收到ServerHello消息后,验证服务器的证书,再用证书公钥验证数字签名,生成一个随机数,然后用服务器的公钥(就是证书中的公钥)加密这个随机数,发送给服务器
  4. 服务器使用私钥解密浏览器发过来的随机数,然后用这个随机数生成对称加密的密钥。
  5. 客户端发一个“Change Cipher Spec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证。服务器完成同样的操作。

HTTP详解

posted @ 2024-04-18 23:40  trashwin  阅读(8)  评论(0编辑  收藏  举报