ssl握手

SSL记录头(5字节)

  • 字节0:记录内容的类型
Content Type Hex Code Description
Change_Cipher_Spec 0x14 指示加密方式的更改
Alert 0x15 发出各种类型的错误信号
Handshake 0x16 携带握手消息的记录
Application_Data 0x17 加密的应用数据
  • 字节1和2:SSL版本(TLSv1是0x0301,SSLv3是0x0300)
  • 字节3和4:记录长度(不包括前面5字节)

握手消息头(3字节)

  • 字节0:握手类型
Handshake Type Hex Code
hello_request 0x00
client_hello 0x01
server_hello 0x02
certificate 0x0b
server_key_exchange 0x0c
certificate_request 0x0d
server_hello_done 0x0e
certificate_verify 0x0f
client_key_exchange 0x10
finished 0x14
  • 字节1-3:握手消息长度(不包括前面3字节)

Client_Hello

告诉服务端客户端期望的协议版本,算法套件和压缩方法。还包括一个32字节的随机数(client_random),由4字节的GMT Unix时间(从1970年开始的秒数)和28字节的随机数组成

TLS1.2中增加了可选的Hello扩展,格式如下

struct {
ExtensionType extension_type;
opaque extension_data<0..2^16-1>;
} Extension;

扩展的类型以及对应的规范可以在此链接查看

Hello扩展类型

字节 长度 描述
00 1 16 记录内容类型 -- 握手消息
01-02 2 03 01 SSL版本 -- TLSv1
03-04 2 00 61 记录长度
05 1 01 握手类型 -- Client_Hello
06-08 3 00 00 5d 消息长度(0x61-4 = 0x5d)
09-0A 2 03 01 客户端偏向的版本 -- TLSv1
0B-0E 4 40 44 35 27 GMT Unix时间
0C-2A 28 5c ... 72 28字节随机数,和4字节的时间组成client_random
2B 1 00 Session ID长度 (恢复会话时使用)
2C-2D 2 00 36 加密套件长度 -- 27个 (每个2字节)
2E-63 54 .... 27个算法套件(TLS1.2 0xFF结尾?)
64 1 01 压缩算法长度
65 1 00 压缩算法: NULL

算法套件对应的编号可以在此链接查看

算法套件

也可以使用openssl ciphers -V 'ECDSA+AES+SM3'

Server_Hello

告诉客户端服务器的选择,协议版本,算法套件,压缩方法。也包括一个32字节的随机数。

字节 长度 描述
00 1 16 记录内容类型 -- 握手消息
01-02 2 03 01 SSL版本 -- TLSv1
03-04 2 00 2a 记录长度
05 1 02 握手类型 -- Server_Hello
06-08 3 00 00 26 消息长度
09-0A 2 03 01 SSL版本 -- TLSv1
0B-0E 4 40 44 35 27 GMT Unix时间
0C-2A 28 cc ... b9 28字节随机数,和4字节的时间组成server_random
2B 1 00 Session ID长度 (恢复会话时使用)
2C-2D 2 00 16 选择的加密套件
2E 1 00 选择的压缩算法NULL

扩展server hello不能出现扩展client hello中没有出现的扩展类型。

Certificate

由正确顺序的X509证书链组成,第一个是服务端证书,后续是签发服务端证书的证书。客户端使用服务端证书的公钥来加密pre_master_secret或者验证server_key_exchange。

字节 长度 描述
00 1 16 记录内容类型 -- 握手消息
01-02 2 03 01 SSL版本 -- TLSv1
03-04 2 02 05 记录长度
05 1 0b 握手类型 -- Certificate
06-08 3 00 02 01 消息长度
09-0B 3 00 01 fe 证书长度
证书

Server_Key_Exchange

Server_Hello_Done

空消息指示所有握手消息发送完毕,因为服务端可以在发送证书消息后发送一些可选的消息,所有需要。

字节 长度 描述
00 1 16 记录内容类型 -- 握手消息
01-02 2 03 01 SSL版本 -- TLSv1
03-04 2 00 04 记录长度
05 1 0e 握手类型 -- Server_Hello_Done
检查最后3字节

Client_Key_Exchange

当使用RSA密钥交换时包含pre_master_secret,包含2字节的版本和46字节的随机数

字节 长度 描述
00 1 16 记录内容类型 -- 握手消息
01-02 2 03 01 SSL版本 -- TLSv1
03-04 2 00 86 记录长度
05 1 10 握手类型 -- Client_Key_Exchange
06-08 3 00 00 82 消息长度
pre_master_secret(130字节,用服务端证书中的公钥加密)

Change_Cipher_Spec

Certificate_Verify

客户端证书地显式验证,只有当证书有签名能力时发送(除了那些包含固定DH参数的证书)

签名的数据是从Client_Hello开始所有发送和接收的握手消息(包括消息的类型和长度),但不包括本条消息

Change_Cipher_Spec

Unknown_Handshaking_Message

Finish

此消息是第一个受保护的消息,接收方必须验证内容正确。摘要计算包括所有握手消息但不包括本消息。 只是握手层可见的数据,不包括记录层头。(注意:change cipher spec, alerts和其他记录类型都不是握手消息)

	verify_data
PRF(master_secret, finished_label, MD5(handshake_messages) +
SHA-1(handshake_messages)) [0..11];

16 03 03 00 50 14 00 00 0c 09 ef c6 0d 6b 32 27 86 e4 73 0c b1

Application_Data

HTTP请求消息:Get /test.html HTTP/1.0

HTTP响应消息

Alert

ssl握手数据结构的更多相关文章

  1. SSL握手过程

    原文地址: http://my.oschina.net/u/1188877/blog/164982 一.SSL握手有三个目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致:2. 它们需要确 ...

  2. SSL握手流程

    一.SSL是什么? 安全套接字(SSL)协议是Web浏览器和Web服务器之间安全交换信息的协议. SSL介于应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层 ...

  3. HTTPS和SSL握手过程(转载)

    https介绍 HTTPS = HTTP + 一组对称.非对称和基于证书的加密技术 HTTPS是最常见的HTTP安全版本.它得到了很广泛的应用,所有主要的商业浏览器和服务器都提供HTTPS.HTTPS ...

  4. 加密、签名和SSL握手机制细节

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 背景知识 对称加密     :加密解密使用同一密钥,加解密速度快.随 ...

  5. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  6. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  7. SSL 握手协议详解

    这里重点介绍一下服务端的验证和密钥交换.这个阶段的前面的(a)证书 和(b)服务器密钥交换是基于密钥交换方法的.而在SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hell ...

  8. 转:SSL 握手协议详解

    SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...

  9. 网络协议相关面试问题-TLS与SSL握手

    HTTPS是什么? HTTPS并不是一个单独的协议,而是对工作在一加密连接(SSL / TLS)上的常规HTTP协议.通过在TCP和HTTP之间加入TLS(Transport Layer Securi ...

随机推荐

  1. 2Sum问题

    2Sum问题是3Sum和4Sum的基础,很多OJ都是以此为最简单的练手题的. 题目描述: 从一个数组里找出两个和为target的数. LeetCode上的描述: Given an array of i ...

  2. MySQL80修改密码

    mysql> update user set password=password('123') where user='root' and host='localhost'; ERROR 106 ...

  3. select 使其默认选中文本不为空

    ```html<select ref="type" v-model="selectedvalue" > <option v-for=" ...

  4. Java 程序员必须了解的 7 个性能指标

    来源:王韵菲  本文中,小编搜集了7个最有影响的衡量标注,让你可以不依赖日志文件来了解应用程序.现在,让我们看看这些性能指标,并了解如何查看并收集它们:     1.响应时间和吞吐量 根据应用程序的响 ...

  5. 封装qq分享静态库到cocopod

    封装qq分享静态库到cocopod  1,创建framework库,到腾讯开放平台(open.qq.com)申请项目appid 2,将iOS SDK中的TencentOpenAPI.framework ...

  6. mybatis 类创建流程

    Configuration ---> XmlConfigBuilder ---> SqlSessionFactoryBuilder ---> SqlSessionFactory(Co ...

  7. mysql免安装版的下载与安装

    下载 打开:https://www.mysql.com/downloads/ 1.点击该项:

  8. web渗透学习方向

    本章写给新加入我们破晓工作室的学弟学妹. 我现在写的是渗透方向的学习方向.因为我参加了线上培训班,听了专门培训渗透的课程后.所以感觉我们工作室自学太累了.如果没有一个“正确”的学习方向都不知道该学些什 ...

  9. centos下源码编译安装MySQL

    解压下载的软件压缩包  tar xzvf mysql-5.1.63.tar.gz 进入解压的目录  cd mysql-5.1.63/ 安装需要的依赖包  yum install gcc gcc-c++ ...

  10. VM安装centos7

    镜像:笔者采用的是CentOS-7-x86_64-Minimal-1810.iso版本 1.创建新的虚拟机 2.典型安装与自定义安装 典型安装:VMwear会将主流的配置应用在虚拟机的操作系统上,对于 ...