当前位置: 首页 > news >正文

Security ❀ HTTP/HTTPS逐包解析交互过程细节

文章目录

  • 1. TCP三次握手机制
  • 2. HTTP Request 请求报文
  • 3. HTTP Response 响应报文
  • 4. SSL/TLS协议
    • 4.1. ClientHello 客户端Hello报文
    • 4.2 ServerHello 服务器Hello报文
    • 4.3. *ServerKeyExchange 服务公钥交换
    • 4.4. ClientKeyExchange 客户端公钥交换
    • 4.5. *CertificateVerify 证书验证报文
    • 4.6. ChangeCipherSpec 更改密钥规格
    • 4.7. Application Data 应用数据报文
    • 4.8. fnished 传输结束报文

本文主要解析 TCP -> HTTP -> SSL/TLS 交互过程中的数据包详细信息。

1. TCP三次握手机制

Client使用随机端口请求Server的HTTP服务80端口(序号1、2、5);
在这里插入图片描述

2. HTTP Request 请求报文

当TCP连接建立完成后,Client发送HTTP请求服务端资源,服务器收到请求后会回复ACK(序号7、8);
在这里插入图片描述
请求类型

  • GET:参数携带位置在URI处;
  • POST:参数携带位置在正文处;
  • PUT:更新资源;
  • DELETE:删除资源;

结尾标识

  • \r\n:字段结尾标识符。

3. HTTP Response 响应报文

当服务器收到HTTP合理且符合规范的请求后,会做出响应,转发到Client;
在这里插入图片描述

4. SSL/TLS协议

SSL/TLS是一个安全通信框架,上面可以承载HTTP协议或者SMTP/POP3协议等(本次以TLS 1.0协议为案例做描述讲解)。协议握手过程如下:
在这里插入图片描述
本文部分报文图片来源于网络,其中169.254.255.66为客户端,169.254.100.98为服务器。

4.1. ClientHello 客户端Hello报文

Client向Server发送一个Hello信息(包26),包含其:可用版本号、当前时间(位于随机数字段下)、客户端随机数(防伪造)、会话ID(会话保持机制)、可用的加算法清单、可用的压缩方式清单;
在这里插入图片描述

常见的12种加密算法:
在这里插入图片描述

扩展内容:
在这里插入图片描述

4.2 ServerHello 服务器Hello报文

Server收到Client的Hello报文后,会向客户端回复一个Hello消息(包27),包含其服务侧的信息:使用的版本号、当前时间、服务器随机数、会话ID、使用的加密算法、使用的压缩方式、CA证书;
在这里插入图片描述
Certificate CA证书:服务侧需要发送自己的证书清单,证书可能是层级结构的,因此除了服务侧本身的证书外还需要提供为服务侧签名的证书,用来证明服务器的合法性。
在这里插入图片描述

4.3. *ServerKeyExchange 服务公钥交换

若服务侧的CA证书信息不足时,可以使用ServerKeyExchange构建加密通道;
ServerKeyExchange包含两种形式:

  • RSA形式加密:传递的就是RSA构建公钥密码的参数E、N;
  • Diff-Hellman密钥交互协议加密:传递的就是密钥交换的参数;

注意,注意,注意:若服务器发送Hello时携带了done的消息,则告诉客户端自己所发的消息结束了,并不会存在ServerKeyExchange报文(包27最底下字段内容)。
在这里插入图片描述

4.4. ClientKeyExchange 客户端公钥交换

ClientKeyExchange仍包含两种方式:

  • 公钥或者RSA模式(包28):Client根据ClientHello的随机数和ServerHello的随机数生成预备主密码,通过该公钥进行加密,返回到服务侧;
  • Diff-Hellman:Client会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。
    在这里插入图片描述

4.5. *CertificateVerify 证书验证报文

Client向Server证明自己是Client证书的持有者。

4.6. ChangeCipherSpec 更改密钥规格

服务器告知客户端切换密码规格(包29),表示后面的消息将会以前面协商通过的密钥进行加密传输。
在这里插入图片描述

4.7. Application Data 应用数据报文

数据传输报文(包30)。
在这里插入图片描述

4.8. fnished 传输结束报文

传输结束标识,代表握手协议结束。

相关文章:

  • 利用 “diart“ 和 OpenAI 的 Whisper 简化实时转录
  • SpringMVC 自动配置
  • 【学网攻】 第(13)节 -- 动态路由(OSPF)
  • Windows Server 2003 Web服务器搭建
  • Mac 上 Ln 指令使用说明
  • WebSocket实现HTML+SpringBoot聊天功能,小程序+SpringBoot聊天功能
  • 谷歌人工智能视频生成器-LUMIERE(未开源)
  • 笔记 | Clickhouse 命令行连接及查询
  • 代码随想录算法训练营Day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • elasticsearch优化总结
  • Linux下Mysql的小版本升级
  • 【C/C++ 01】初级排序算法
  • RabbitMQ之三种队列之间的区别及如何选型
  • 自然语言处理(NLP)技术使用
  • C#-正则表达式
  • Android框架之Volley
  • Apache Spark Streaming 使用实例
  • Cookie 在前端中的实践
  • emacs初体验
  • IDEA常用插件整理
  • leetcode-27. Remove Element
  • python3 使用 asyncio 代替线程
  • vue2.0项目引入element-ui
  • webgl (原生)基础入门指南【一】
  • yii2权限控制rbac之rule详细讲解
  • 订阅Forge Viewer所有的事件
  • 聊一聊前端的监控
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 新版博客前端前瞻
  • 新书推荐|Windows黑客编程技术详解
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 应用生命周期终极 DevOps 工具包
  • ionic异常记录
  • 通过调用文摘列表API获取文摘
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #QT(TCP网络编程-服务端)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4) PIVOT 和 UPIVOT 的使用
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (分布式缓存)Redis持久化
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (转)iOS字体
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转载)(官方)UE4--图像编程----着色器开发
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Micro Framework 4.2 beta 源码探析
  • .net mvc 获取url中controller和action
  • .net 流——流的类型体系简单介绍
  • @SuppressWarnings(unchecked)代码的作用