HTTP相关问题

156 阅读7分钟

HTTP

  • 无状态
  • 简单快速
  • 基于TCP/IP
  • 灵活
  • 明文传输
  • 默认端口号:80

HTTPS

  • 证书加密
  • 安全
  • SSL/TLS
  • = HTTP + SLL/TLS
  • 默认端口号:443

加密

SSL

  • 对称加密:采用协商的秘钥进行对数据加密
  • 非对称加密:实现身份认证和秘钥协商
  • 摘要算法: 验证信息的完整性
  • 数字签名:身份证验证

对称加密

指的是加密和解密的秘钥都是同一个,是对称的,只要保证了秘钥的安全即可

明文=> 加密数据=> 服务端解密

非对称加密

存在两个秘钥,一个是私钥、一个公钥

私钥和公钥都是可用加密解密,但是公钥加密后只能用私钥解密(国密sm???),反过来,私钥加密后,只能通过公钥解密

明文=> 公钥加密=> 服务器接收=> 私钥解密=>明文

混合加密

将对称加密和非对称加密结合起来,就是https加密的流程啦

  • 非对称加密,使用的获取交换信息的秘钥
    • 开销大
    • 加密复杂
    • 安全系数高
  • 对称加密,主要等客户端、服务端都完成非对称加密后,进行加密信息的传入
    • 开销小
    • 加密简单
    • 只需要同一个秘钥即可

为什么要这样做呢?

  • 单独使用对称加密,一旦泄露秘钥则不安全
  • 先用非对称加密,加密私钥,形成秘钥在进行通讯,更安全

CA

  • 第三方认证机构,可以发放SSL证书

SSL

  • 相当于身份证
  • 里面包公钥
  • 支撑加密方式(SHA256)

流程

第一次,客户端通知服务端,发送对应证书信息、版本、R1
  • Client Hello
    • 客户端发起
    • 浏览器端根据可支持加密方式、CA证书(SSL证书)、加密套件、SSL版本
    • 生产一个随机R1
    • 2个消息发送给服务端
第二次,服务端接接收到R1、选择可用的证书、版本,生产R2返回到客户端,验证身份证
  • Server Hello
    • 执行者:客户端
    • 确定加密方式、SSL版本、加密版本(这边只是挑选可以求作用的套件)
    • 生产一个随机R2
    • 结合发送给客户端
  • Certifcate
    • 执行者:服务端
    • 出示自己的证书,表明身份证,来确定是自己不是别人假冒
    • 服务端发起给客户端
  • Server Key Exchange
    • 执行者:服务端
    • 将公钥发送给客户端
    • 可以发出要求客户端发送自己的证书,保证安全
    • 服务端发出个客户端
  • Server Hello End(结束)
    • 执行者:客户端
    • 告诉客户端我都ok了
    • 服务端发出客户端

第三次,客户端收到数据,并且拿到pubkey,确认身份证,然后随机生成R3,加密生产预主秘钥,发送给客户端

  • Client Exchange Key,Encrypted Handshake Message
    • 执行者:客户端
    • 客户端生产第三个随机数R3
    • 客户端收到了服务端的公钥,会将公钥加密R3=>预主秘钥
    • 发送给服务器,报文pubkey指向的及时预主秘钥
    • 客户端发出服务端

第四次,服务端收到预主秘钥,通过私钥解析或主要R3,将R123进行加密通讯秘钥

  • Encrpyted Handke Message
    • 执行者:服务端
    • 客户将接收预主秘钥,通过服务端秘钥进行解密,生产R3
    • 统一将R1,R2,R3进行生产生产通讯秘钥
    • 发送给客户端,我这边搞定了
  • 客户端将R123通过算法生产通讯秘钥
  • 开始通讯

特点

  • 仅在当前通话中有效,离开则失效

摘要算法

又称hash算法,输入任意长度的数据,可以返回一个固定长度的数据

这个摘要算法主要是在第二步,ca证书认证时候用到的

  • MD5
  • SHA-1
  • SHA-256

为什么要是用摘要算法?

首先我们可以加密后得到一个固定长度数据,是与原文完全等价的,其次我们在原文附后他的摘要

let message = 'abc';

let sha2str = SHA2(message)


return message + sha2str;

这样我们可以把数据传输到对方,对方可以将数据的sha2str解密,对比原文,是否相同,避免有人修改明文

message=> 证书信息

  • 浏览器需要发送

    message

  • 将message用sha2编译摘要,并添加到messag后面,形成msgstr

  • 将msgstr和从非对称加密后的通讯秘钥进行加密发送

  • 服务器接收到数据,将通讯秘钥解密获取到msgstr

  • 截取msg进行sha2编译,对比str是否相同

  • 相同则接收,ok认证成功是真的证书

这是算法,不是传输协议

  • 加密
    • 信息进行信息摘要(SHA2、MD5算法),生产密文
    • 通过秘钥(数字证书)进行str加密
    • 摘要+密文,搭配证书公钥,生产数字签名
    • 发送
  • 解密
    • 收到数据,进行公钥解密生产摘要+密文
    • 将信息进行信息摘要,形成密文
    • 匹配密文与信息是否相等

数字签名

数字签名可能确定消息缺失有发送方签名并发送的,因为别人假冒不了发送发的签名

  • 流程
    • 服务器运营人员向CA认证机构提出公开密钥的申请
    • CA机构在判断申请身份后,对公钥做数字签名
    • 将签名+公钥,绑定一起,这就是公钥证书
    • 服务器会CA机构发布的公钥证书发送给客户端,进行非对称加密通讯(Certificate阶段)
    • 客户端接收到CA证书后,可以将里面公钥对气签名(Sign)签名验证
    • 确定是否真实可信赖

优化

  • 使用SLB(服务器负载均衡)
  • 使用CDN(内容分发网络)

中间人攻击

因为有中间人攻击,所以加入了CA数字签名

  • 客户端发送请求公钥
  • 中间人拦截,替代客户端发送
  • 中间人收到公钥,并制造一个FAKE公钥
  • 每次加密后,都可以用,中间人都是解密拿到数据,然后用真实公钥加密代替发送
  • 拿到数据后解密,通过自己的des加密发送给服务端

所以我们要防止被中间人攻击,需要引入CA证书

中间人会去篡改证书吗

可能会获取到证书,修改证书的域名,但是CA机构的撕咬的是本地的,他拿不到。无法创建一个新的签名,签名是需要申请的。

客户端收到篡改的证书, 通过私钥解密证书摘要,同时客户端也要对收到证书内容生产信息摘要,2个Str对比发现存在问题,则断开连接

版本

HTTP1.0

每次请求只能等到返回数据后才能再次请求

短连接

每次与服务器交互必须再次链接

HTTP1.1

每次请求后,会长连接状态keep-alive

一次TCP/IP链接,可以发送多个HTTP请求和接收多个响应,增加了沟通效率

同时客户端,可以不用等上次请求结果,直接再次发送,但是服务器是必须同步按序返回数据。

新增

  • 缓存控制,cache-control、IF-No-Match -E-tag、 experise、 maxage等控制花村
  • 引入range,控制运行值请求某个部分
  • 引入host,实现一台web服务器可以再同一个ip和端口上使用不用的主机名来创建多个虚拟节点
  • Put delete update options方法

HTTP2.0

  • 多路复用
  • 二进制分针
  • header压缩
  • 服务器推送

多路复用

HTTP/2 复用TCP链接,在一个链接里,客户端和服务端都可以同时发送多个请求,不用按照顺序一一对应,便面了队列阻塞

二进制分帧

帧是HTTP2中最小的信息单温

采用二进制格式,而非1.x版本的文本格式,解析起来更高效

其实就将数据解析成二进制数据

因为在http2中,同域名下的所有通讯都是单连接中完成,该链接中可以承载任何数量的双向数据流

每个数据流都是二进制数据发送,根据帧头部的流表示区别后重新编码装

首部压缩

因为只有一次链接,所以客户端和服务端使用首部表来跟踪和记录之前发送的键值对,对相同数据,不咋进行响应和回复

首部表是在连接中始终存在的,由服务端、客户端共同更新维护

服务器推送

可以让服务器主动推送到客户端