zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    python使用tcp实现一个简单的下载器
    python中的tcp
    python使用udp实现聊天器
    python网络编程-udp
    python中的eval函数
    python文件
    python模块和包
    python异常处理
    python面向对象学习(七)单例
    python面向对象学习(六)类属性、类方法、静态方法
  • 原文地址:https://www.cnblogs.com/logchen/p/10403061.html
Copyright © 2011-2022 走看看