ssl握手数据结构
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握手数据结构的更多相关文章
- SSL握手过程
原文地址: http://my.oschina.net/u/1188877/blog/164982 一.SSL握手有三个目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致:2. 它们需要确 ...
- SSL握手流程
一.SSL是什么? 安全套接字(SSL)协议是Web浏览器和Web服务器之间安全交换信息的协议. SSL介于应用层和TCP层之间,应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层 ...
- HTTPS和SSL握手过程(转载)
https介绍 HTTPS = HTTP + 一组对称.非对称和基于证书的加密技术 HTTPS是最常见的HTTP安全版本.它得到了很广泛的应用,所有主要的商业浏览器和服务器都提供HTTPS.HTTPS ...
- 加密、签名和SSL握手机制细节
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 背景知识 对称加密 :加密解密使用同一密钥,加解密速度快.随 ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例
SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html 分享到:8 发布时 ...
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...
- SSL 握手协议详解
这里重点介绍一下服务端的验证和密钥交换.这个阶段的前面的(a)证书 和(b)服务器密钥交换是基于密钥交换方法的.而在SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hell ...
- 转:SSL 握手协议详解
SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...
- 网络协议相关面试问题-TLS与SSL握手
HTTPS是什么? HTTPS并不是一个单独的协议,而是对工作在一加密连接(SSL / TLS)上的常规HTTP协议.通过在TCP和HTTP之间加入TLS(Transport Layer Securi ...
随机推荐
- 【原创】Proxmark3系列教程1——PM3用法
1 PM3介绍 proxmark3是一款开源的RFID安全研究平台黑色按钮从图中我们可以看到左上方有一颗黑色按钮,这个按钮就是Proxmark3的功能键,主要用于启动嗅探模式以及停止进程功能,其中内置 ...
- UVA548 tree的思路
唔,首先这题给出了中序遍历和后序遍历要求我们求出, 一个叶子节点到根的数值总和最小,且这个叶子节点是最小的那个 这题的难点在于如何运用中序遍历和后序遍历还原整棵树, 这里有两个方法: 1. 递归构造原 ...
- 微信小程序 数据库指引 前端操纵数据库失败
把注释解开后,点击添加显示失败了 看了下注解,发现是数据库权限问题, 修改一下成第一个,然后点击又失败了,多点击几下,就会成功! 哦 别忘了时刻 ctrl +s 保存,如果你习惯了idea 自动保存的 ...
- Spring xml配置
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.s ...
- VBO最佳实践
VBO的大小 一个VBO应该多大? 你可以创建一个很小的VBO,但最佳方案是把很多对象放到一个VBO里面,这样的话可以减少调用gl函数的数量,比如glBindBuffer.glVertexPointe ...
- 如何在Linux上设置SSH密码以进行无密码登录(转)
ssh(secure shell)广泛用于远程登录Linux服务器.当我们使用ssh登录到远程系统时,它会提示输入密码,然后只允许我们登录到服务器.有时我们需要配置应用程序或脚本(主要是shell脚本 ...
- Python:从入门到实践--第三章--列表简介--练习
#1.将一些朋友的姓名存储在一个列表中,并将其命名为friends.依次访问该列表中的每个元素,从而将每个朋友的姓名都打印出来. #2.继续使用1中的列表,为每人打印一条消息,每条消息包含相同的问候语 ...
- MHA-Atlas-MySQL高可用集群
主机名映射 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 loca ...
- 【译著】Code First :使用Entity. Framework编程(5)
第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...
- JAVA创建和销毁对象
类静态方法取代构造方法创建对象 类静态方法有名称,可以通过名称说明返回的是什么类型的实例 可以控制是否需要新开辟内存空间 返回值是可以控制的 实体类属性非常多的时候使用build模式创建对象 单例实体 ...