TLS/SSL协议格式(一)

概述

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容