美文网首页
TLS/SSL协议格式(一)

TLS/SSL协议格式(一)

作者: allanYan | 来源:发表于2017-01-18 18:40 被阅读0次

    概述

    TLS/SSL协议实际上是分层的,类似IP/TCP协议;

    record.png

    TLS Record Protocol

    上图为一个TLS Record Layer包,可用看到其结构为:

    1. ContentType(1byte)

    Record类型:

    • change_cipher_spec(20)
    • alert(21)
    • handshake(22)
    • application_data(23)
    1. ProtocolVersion(2bytes)
      TLS/SSL协议版本号,例如0301表示TLS1.0,0302表示TLS1.1,0303表示TLS1.2;

    2. length(2bytes)
      Body数据的长度,最大为2^14;

    3. Body
      消息体,具体的格式由ContentType、是否压缩、是否加密决定;

    TCP包中除了TLS Record Layer外,可以看到前面还有部分内容,这是因为按照网络协议七层规范,层次关系为数据链路层-》网络层-》传输层-》TLS/SSL;
    其中数据链路层的结构为目的地址+源地址+类型,对应到图上:

    • 0x58696c1a3562为目的地MAC地址58:69:6c:1a:35:62
    • 0x985aebdc189d为源MAC地址98:5a:eb:dc:18:9d
    • 0x0800代表IP协议
    • 4表示IP版本为4
    • 5 表示Header为5,由于单位为4bytes,因此Header长度为20bytes;
    • 0x00表示服务类型
    • 0x015b表示总长度为347
    • 0x1ba5表示标识
    • 0x4000的前3bit为010(即0x02),为flag,表示不分片,后13位表示片偏移量,此处为0
    • 0x40表示存活时间,即64,虽然按照理论64表示存活时间为64秒,但实际上64是指数据包被路由器丢弃之前允许通过的网段数量;
    • 0x06表示传输层协议为TCP
    • 0x0000表示奇偶校验和,此处应该是不进行校验
    • 0x0a2428f1是IP协议中的源IP地址,即 10.36.40.241
    • 0xf1dcb56fbc是IP协议中的目的IP地址,即220.181.111.188
    • 0xcb5b是TCP协议中的源端口,即52059
    • 0x01bb是TCP协议中的目的端口,即443
    • 0xd0f132bd表示sequence number
    • 0x3d5b2db3表示acknowledge number
    • 0x50表示的前8个bit表示数据偏移量,也即Header长度,和前面类似,单位为4bytes,即Header长为20bytes;
    • 0x018表示Flags

    Handshake Protocol

    TLS Record Protocol的ContentType=22时,Body的内容采用Handshake Protocol;

    1. HandshakeType:
      握手类型,包括:
    • hello_request(0)
    • client_hello(1)
    • server_hello(2)
    • certificate(11)
    • server_key_exchange (12)
    • certificate_request(13)
    • server_hello_done(14)
    • certificate_verify(15)
    • client_key_exchange(16)
    • finished(20)
    1. length
      消息长度,占用3bytes;

    Hello request

    概述

    Hello request消息由服务端发送给客户端,通过客户端重新开始SSL握手;

    消息格式

    消息体为空;

    Client hello

    概述

    客户端发送Client hello消息开始SSL握手;

    消息格式

    1. ProtocolVersion

      2bytes,客户端希望使用的SSL/TLS协议版本号,一般而言应该是客户端支持的最大版本号;

    2. Random

      • GMT Unix timstamp

        4bytes,标准的UNIX 32位时间格式,表示距离1970年1月1号的秒数;

    • Random bytes
      28bytes,通过SecureRandom产生;
    1. SessionId

      SessionId可为空,长度不固定,编码方式采用长度+内容,用1byte表示长度,读取时先读取长度,然后根据长度读取内容;

    2. CipherSuiteList
      编码方式采用长度+内容,用2bytes表示长度,读取时先读取长度,然后根据长度读取内容;每个CipherSuite占用2bytes;例如0xc030表示TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;具体可参见RFC5246;

    3. CompressionMethod
      压缩方法,编码方式采用长度+内容,用1byte表示长度,读取时先读取长度,然后根据长度读取内容;

    4. Extensions
      编码方式采用长度+内容,用2bytes表示长度,读取时先读取长度,然后根据长度读取内容;
      每个Extension的格式为:

      type(2bytes)+length(2bytes)+extension body
      

      Extension的type定义请参见RFC 3546,列举部分如下:

      • server_name(0)
      • max_fragment_length(1)
      • client_certificate_url(2)
      • trusted_ca_keys(3)
      • truncated_hmac(4)
      • status_request(5)

    server hello

    概述

    Server hello消息由服务端发送给客户端,作为Client hello的响应;如果服务端无法找到匹配的SSL/TLS版本或CipherSuits,会返回handshake failure alert;

    消息格式

    1. ProtocolVersion

      2bytes,服务端根据客户端的ProtocolVersion和自己支持的版本,协商出来的版本号;

    2. Random

      • GMT Unix timstamp

        4bytes,标准的UNIX 32位时间格式,表示距离1970年1月1号的秒数;

    • Random bytes
      28bytes,通过SecureRandom产生;
    1. SessionId

      SessionId可为空,长度不固定,编码方式采用长度+内容,用1byte表示长度,读取时先读取长度,然后根据长度读取内容;

    2. CipherSuite
      服务端选用的CipherSuite,占用2bytes;例如0xc030表示TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;具体可参见RFC5246;

    3. CompressionMethod
      占用1byte,服务端选用的压缩算法;

    4. Extensions
      编码方式采用长度+内容,用2bytes表示长度,读取时先读取长度,然后根据长度读取内容;
      每个Extension的格式为:

      type(2bytes)+length(2bytes)+extension body
      

      Extension的type定义请参见RFC 3546,列举部分如下:

      • server_name(0)
      • max_fragment_length(1)
      • client_certificate_url(2)
      • trusted_ca_keys(3)
      • truncated_hmac(4)
      • status_request(5)

    Server certificate

    概述

    服务端发送证书到客户端,客户端据此验证服务端身份;一般而言,该消息紧跟着Server hello消息;

    消息格式

    1. Certificate Chain length

    证书链所占用的字节,用3bytes表示;

    1. X509 Certificate Lists
      列表中的第一个证书为TLS/SSL会话采用的证书,从该证书从获取公钥作为会话的公钥;每个Certificate的格式为:
    • Certificate Length

      用3bytes表示证书内容长度,获取长度之后再根据长度获取证书内容;

    • Certificate Content:

      长度由Certificate Length决定;

    Server key exchange

    概述

    该消息一般紧接着Server certificate消息;该消息并不是必须的,取决于协商出的key交换算法;如果Server certificate并不包含计算premaster的所有参数,则必须发送该消息;
    采用如下算法需要发送Server certificate消息:

    • RSA_EXPORT (公钥长度>512bits)
    • DHE_DSS
    • DHE_DSS_EXPORT
    • DHE_RSA
    • DHE_RSA_EXPORT
    • DH_anon

    采用如下算法不需要发送Server certificate消息:

    • RSA(公钥长度<=512bits)
    • DH_DSS
    • DH_RSA
    • ECDH_ECDSA
    • ECDH_RSA

    由于目前使用较多的是ECDHE,本文只介绍该格式:

    消息格式

    1. Curve Type

    1byte,目前为常量0x03;

    1. Curve Id
      2bytes,列举部分如下,例如0x0017(23)表示secp256r1;
    • "1.2.840.10045.3.1.7", // (23) secp256r1, NIST P-256
    • "1.3.132.0.34", // (24) secp384r1, NIST P-384
    • "1.3.132.0.35", // (25) secp521r1, NIST P-521
    1. Pubkey length
      1byte,
    2. Pubkey content
      长度由Pubkey length指定;

    Certificate request

    概述

    该消息是可选的,如果服务端需要验证客户端身份,可以通过该消息要求客户端提供证书;

    消息格式

    1. Certificate Type
      证书类型,包含下述类型:
    • rsa_sign(1)
    • dss_sign(2)
    • rsa_fixed_dh(3)
    • dss_fixed_dh(4)
    1. Algorithms

    哈希和签名算法列表,从TLS1.2开始,之前版本不存在该字段;用2bytes存储算法列表占用的字节数;
    每个Algorithm由hash(1byte)+signature(1byte)组成;

    1. Certificate authority List
      可指定root CA;用2bytes存储长度,每个Certificate authoritylength(2bytes)+content(长度由length确定)组成;

    Client certificate

    Server certificate相同

    Ceritificate verify

    概述

    该消息由客户端发送到服务端,校验证书

    消息格式

    1. protocolVersion>=TLS1.2
    Hash Algorithm(1byte)+Sgin Algorithm(1byte)+signature length(2bytes)+signature content
    
    1. protocolVersion<TLS1.2
    length(2bytes)+signature content
    

    相关文章

      网友评论

          本文标题:TLS/SSL协议格式(一)

          本文链接:https://www.haomeiwen.com/subject/fndbbttx.html