| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 用Wireshark看见TLS握手过程 -> 正文阅读 |
|
[开发测试]用Wireshark看见TLS握手过程 |
摘要第一部分:介绍TLS握手协议内容。(非常粗略的介绍,详见《图解密码技术》-- 结城浩 – 第14章 SSL/TLS 为了更安全的通信) 第二部分:安装wireshark,使用其进行抓数据包,为后面TLS分析做准备。 第三步:详细查看TLS握手的每一步。最后使用一个示例验证握手过程的掌握情况。 TLS握手协议介绍本节来源:《图解密码技术》-- 结城浩 – 第14章 SSL/TLS 为了更安全的通信 TLS 协议 是由 TLS 记录协议 ( TLS record protocol) 和 TLS 握 手协议 ( TLS handshake protocol) 这两层协议叠加而成的。 TLS 握手协议分为下列 4 个子协议 : 握手协议、密码规格变更协议、警告协议和应用数据协议。 握手协议是 TLS 握手协议的一部分,负责生成共享密钥以及交换证书 。 其中,生成共享密钥是为了进行密码通信,交换证书是为了通信双方相互进行认证。 握手协议的过程如下图所示 。 下一节,我们通过抓包,验证这张图片中的握手过程。 准备工作安装wireshark
wireshark的使用我的抓包需求:
所以,wireshark输入设置如下。 我们使用openssl-s_client,作为客户端程序。(不使用浏览器是避免一些不必要的干扰)
wireshark抓取内容如下: 看见TLS握手过程(0)TCP的三次握手 前三个数据包是TCP的三次握手过程,感兴趣的话,可以阅读实战!我用 Wireshark 让你“看见“ TCP (1)Client Hello (客户端–>服务器) 其中的密码套件,拉出来,单独介绍下。
密码套件-wiki中的参考链接7–TLS/SSL (Schannel SSP) 中的密码套件,内容不错,我搬运下。 密码套件是一组加密算法。 TLS/SSL 协议的 schannel SSP 实现使用密码套件中的算法来创建密钥和加密信息。 密码套件为以下每种任务指定一种算法:
开发人员通过使用 密码套件名称结构,如下图所示。 可以看到 至于每个套件的具体含义,我不知道到。遇到一个查一个呗。 (2) Server Hello (客户端<–服务器) 服务器给客户端发送的内容:使用的版本号,当前时间,服务器随机数,会话 ID,使用的密码套件,使用的压缩方式 新建立的会话,Session id length是0。参考SSL_get_session,当session还存在时,ssl 会话包含重新建立连接所需的所有信息,无需完全握手。(有点类似与web中的session) 我们来看下
(3) Certificate (客户端<–服务器) 服务器向客户端发送证书清单。证书清单是一组 X.509v3 证书序列,首先发送的是服务器(发送方)的证书,然后会按顺序发送对服务器证书签名的认证机构的证书 。客户端会对服务器发送过来的证书进行验证 。 (4)ServerKeyExchange (客户端<–服务器) 当 Certificate 消息不足以满足需求时,服务器会通过 ServerKeyExchange 消息向客户端发送一些必要信息 。 具体所发送的信息内容会根据所使用的密码套件而有所不同 。 当不需要这些信息时,将不会发送 ServerKeyExchange 消息 。 上图的Pubkey应该是ECDHE算法需要的两个随机数中的一个。使用rsa算法,对client hello 的随机值,server hello 的随机值,Pubkey值进行签名,表明服务端有对应证书的私钥。 (5)CertificateRequest (客户端<–服务器) 服务端要看客户端的证书。访问百度,不需要对客户端进行认证,所以没有该消息。 (6)ServerHelloDone (客户端<–服务器) 表示从 ServerHello 消息开始的一系列消息的结束 。 (7) Certificate (客户端–>服务器) 服务器读取客应端的证书并进行验证。当服务器没有发送 CertificateRequest 消息时, 客户端不会发送 Certificate 消息 。所以,没有该消息。
(8)ClientKeyExchange (客户端–>服务器) 当密码套件中包含 RSA 时, 会随 ClientKeyExchange 消息一起发送经过加密的预备主密码 。 (9) CertificateVerify (客户端–>服务器) 客户端只有在服务器发送 CertificateRequest 消息时才会发送 CertificateVerify 消息 。 这个消息的目的是向服务器证明自己的确持有客户端证书的私钥 。所以,没有该消息。 (10)ChangeCipherSpec (客户端–>服务器) 实际上, ChangeCipherSpec 消息并不是握手协议的消息,而是密码规格变更协议的消息 。 在 ChangeCipherSpec 消息之前,客户端和服务器之间已经交换了所有关于密码套件的信息,因此在收到这一消息时,客户端和服务器会同时切换密码 。 在这一消息之后, TLS 记录协议就开始使用双方协商决定的密码通信方式了 。 (11)Encrypted Handshake Message (客户端–>服务器) 参考: Encrypted Handshake Message、TLS/SSL 协议详解 (19) Encrypted handshake message
(12)New Session Ticket (客户端<–服务器)
(13)ChangeCipherSpec (客户端<–服务器)
(14)Encrypted Handshake Message (客户端<–服务器) 介绍同“(11)Encrypted Handshake Message (客户端–>服务器)”。 (15)到上面,握手结束,之后可以传送加密消息流(客户端<–>服务器) 在此之后,客户端和服务器会使用应用数据协议和 TLS 记录协议进行密码通信 。 我们通过抓包的方式,一步步的看见了TLS的握手过程。接下来,我们验证下,我们是否真的搞明白了整个握手过程。 下面这张图来自:catbro666-TLS ECDHE密钥交换时的认证。 这张图和上面整个过程有一个地方不同的是图中的server端生成了两个DH param,而上面显示的是server和client各生成一个DH param。 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 22:22:10- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |