TLS/SSL 协议 - ClientHello
ClientHello
在一次新的握手流程中,ClientHello消息总是第一条消息。这条消息将客户端的功能和首选项传送给服务器。客户端会在新建连接后,希望重新协商或者响应服务器发起的重新协商请求(由HelloRequest消息指示)时,发送这条消息。
Wireshark 抓取ClientHello消息:
Version
协议版本(protocol version)指示客户端支持的最佳协议版本。从低到高依次 SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2,当前基本不再使用低于 TLSv1 的版本;- Random
随机数(random)字段包含32字节的数据。当然,只有28字节是随机生成的;剩余的4字节包含额外的信息,受客户端时钟的影响。4个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数,那么时间是不断的上涨的,通过前4字节填写时间方式,有效的避免了周期性的出现一样的随机数。使得“随机”更加“随机”。随机数是用来生成对称密钥的。
在握手时,客户端和服务器都会提供随机数。这种随机性对每次握手都是独一无二的,在身份验证中起着举足轻重的作用。它可以防止重放攻击,并确认初始数据交换的完整性。 Session ID
在第一次连接时,会话ID(session ID)字段是空的,这表示客户端并不希望恢复某个已
存在的会话。在后续的连接中,这个字段可以保存会话的唯一标识。服务器可以借助会话ID在自己的缓存中找到对应的会话状态。
如果Session id length有值,对于 SSL 2.0 Session id length 0~16字节,其后的版本扩大到32字节。本报文中Session id length是0,后面就没有跟Session id,直接是Cipher suit length。
Session id并不一定是32字节,RFC规定可以0~32字节。只是Session id由服务器生成,服务器普遍采用OpenSSL,而OpenSSL基本只生成32字节的session id,如果碰到其他字节长度的Session id,切莫认为是异常client hello。Cipher Suites
密码套件(cipher suite)块是由客户端支持的所有密码套件组成的列表,该列表是按优先级顺序排列的。加密套件列出了客户端能够支持的加密方式、算法等信息。不同的加密套件性能不一样,安全性不一样,也导致了SSL交互报文的不一样。
例如,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 各字段含义:
字段 | TLS | ECDHE | RSA | WITH | AES_256_GCM | SHA384 |
---|---|---|---|---|---|---|
解释 | 代表TLS协议 | 对称加密密钥交换算法 | 非对称密钥算法,也就是公钥/私钥算法 | 分割作用 | 对称加密算法 | 哈希算法 |
示例1:
TLS_RSA_WITH_RC4_128_SHA1,它表示,密钥交换使用RSA,身份认证算法用RSA(证书是身份认证一部分,我们还需要用RSA去验证证书),对称加密算法使用RC4,摘要算法使用SHA1。
示例2:
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA1,它表示,密钥交换算法使用ECDHE(短暂椭圆曲线),身份认证算法使用ECDSA,对称加密算法使用AES_128_CBC,摘要算法使用SHA1。
客户端把自己所支持的加密套件全部发送给服务器,服务器会从中选择一个加密套件。每个加密套件用2字节表示。每个加密套件用2字节表示,这里一共30个加密套件,所以理所当然的,Cipher Suits Length是30 * 2 = 60字节。
- Compression
客户端可以提交一个或多个支持压缩的方法。默认的压缩方法是null,代表没有压缩。 - Extensions
扩展(extension)块由任意数量的扩展组成。这些扩展会携带额外数据。TLS扩展是一种通用目的的扩展机制,使用这种机制可以在不修改协议本身的条件下为TLS协议增加功能。
例如:Server_name(SNI):
SSL存在验证证书的时候,有这么一个判断:比较“浏览器输入的地址”和“获取的证书的名称”。如果一样,那么接着验证,如果不一样,那么认为证书是不可信的。
[参考文献]
- 百度百科 SSL
- 《HTTPS 权威指南:在服务器和Web应用上部署SSL/TLS和PKI》
- SSL/TLS握手过程 https://www.cnblogs.com/barrywxx/p/8570715.html
- TLS/SSL 协议详解 (9) Client hello https://blog.csdn.net/mrpre/article/details/77867439
- 例说图解TCP/IP协议族--TLS篇(1)抓包分析SSL/TLS握手 https://blog.csdn.net/Wendy019900107/article/details/90042622
TLS/SSL 协议 - ClientHello的更多相关文章
- TLS/SSL 协议 - ServerHello
ServerHello ServerHello消息的意义是将服务器选择的连接参数传送回客户端.这个消息的结构与ClientHello类似,只是每个字段只包含一个选项. 服务器无需支持客户端支持的最佳版 ...
- TLS/SSL 协议 - ServerKeyExchange、ServerHelloDone
ServerKeyExchange ServerKeyExchange消息的目的是携带密钥交换的额外数据.消息内容对于不同的协商算法套件都会存在差异.在某些场景中,服务器不需要发送任何内容,这意味着在 ...
- 深入TLS/SSL协议
总体 TLS/SSL协议是为了解决网络通讯中的信息安全问题而诞生的. 它的设计目的主要有三个: 身份验证--搞清楚与我通讯的人是不是我所想的那个. 保密性--就算第三方拿到了通讯内容,也搞不清楚其中所 ...
- TLS协议工作过程;如何应用TLS/SSL协议为WEB流量提供安全
SSL/TLS协议的基本过程是这样的: 客户端向服务器端索要并验证公钥. 双方协商生成"对话密钥". 双方采用"对话密钥"进行加密通信. 上面过程的前两 ...
- TLS/SSL 协议详解 ssL 、TLS 1.0、TLS 1.1、TLS 1.2的了解
TLS 1.0 RFC http://www.ietf.org/rfc/rfc2246.txt TLS 1.1 RFC http://www.ietf.org/rfc/rfc4346.txt TLS ...
- TLS/SSL 协议 - Server Certificate
Server Certificate 典型的Certificate消息用于携带服务器X.509证书链.证书链是以ASN.1 DER编码的一系列证书,一个接着一个组合而成.主证书必须第一个发送,中间证书 ...
- TLS握手协议分析与理解——某HTTPS请求流量包分析
https://xz.aliyun.com/t/1039 HTTPS简介 HTTPS,是一种网络安全传输协议,在HTTP的基础上利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护 ...
- HTTPS(身披SSL协议的HTTP)
参考链接: HTTP 与 HTTPS 的区别 HTTPS科普扫盲帖 HTTPS小结 HTTP 和 HTTPS 区别 HTTP是明文传输未加密,安全性差,HTTPS(HTTP + SSL)数据传输是加密 ...
- 用TLS/SSL保证EMQ的网络传输安全
作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broker支持TLS,也可以用这种方式来确保传输安全. 参考官网:https://www.em ...
随机推荐
- Mybatis笔记 - SQL标签方法
Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...
- 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...
- Openstack组件实现原理 — Keystone认证功能
目录 目录 前言 Keystone安装列表 Keystone架构 Keystone的管理对象 一个理解Keystone管理对象功能的例子 Keystone管理对象之间的关系 Keystone V3的新 ...
- JAVA中一个汉字占多少个字符(转载)
1.先说重点: 不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节也是不确定的,可能是2个.3个.4个字节: 2.以下是源码: 1 @Test 2 public void test1() ...
- Linux基础-文件管理
<1>查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令. Linux文件或者目录名称最长可以有265个字符,“ ...
- Jmeter脚本如何在Linux通过no GUI的方式运行 命令行传递参数
本文主要介绍Jmeter脚本如何在Linux通过no GUI的方式运行.总共分三部分: 1.Linux下JDK的安装及环境变量的配置 2.Linux下Jmeter的安装及环境变量的配置 3.运行结果的 ...
- PHP简单导出Excel表格
<?php header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; ...
- Python面试题之“猴子补丁”(monkey patching)指的是什么?这种做法好吗?
“猴子补丁”就是指,在函数或对象已经定义之后,再去改变它们的行为. 举个例子: import datetime datetime.datetime.now = lambda: datetime.dat ...
- 代码迁移到华为云上和Git的坑
代码迁移到华为云上和Git的坑 先设置小乌龟Git上方式为ssh 参考链接:https://www.liangzl.com/get-article-detail-3586.html 注意:Tortoi ...
- Javascript高级程序设计--读书笔记之面向对象(一)
哈哈哈万物皆对象,终于到了js的面向对象篇. 一.属性类型 (1)数据属性 数据属性包含一个数据值的位置,在这个位置可以写入和读取数值,数据属性有四个描述器行为的特性 [[Configurable]] ...