根据RFC 5246(定义TLS协议版本1.2)
第18页:
记录层将信息块分段为TLSPlaintext 以2 ^ 14字节或更少字节的块存储数据的记录。客户 消息边界不保留在记录层中(即, 可以合并具有相同ContentType的多个客户端消息 到单个TLSPlaintext记录,或单个消息可能是 分散在几个记录中。)
在第40页上它说:
TLS允许扩展遵循一个中的compression_methods字段 扩展块。可以通过检测扩展的存在 确定compression_methods之后是否有字节 在ClientHello的末尾。注意这种检测方法 可选数据不同于普通的TLS方法 可变长度字段,但它用于与TLS兼容 在定义扩展之前。
我从这段经文中理解的是,当我完成解析ClientHello
消息时,我应该将其大小与封装记录层消息的TlsPlaintext.length
字段进行比较,以查看是否有任何额外消息记录层消息末尾的字节,如果有,则将它们解释为Extension
结构。
这实际上适用于我测试我的应用程序的一些TLS流量样本,但是对于其他一些(或者它无法检测到wireshark可以发送的消息)失败。当我使用wireshark查看有问题的数据包时,看起来几个握手消息组合成一个握手消息。这些是ServerHello
(看起来与ClientHello
完全相同),其中包含扩展程序,Certificate
和ServerHelloDone
消息。
当Hello消息被封装在单个握手消息中时,检测Hello扩展很容易,但我无法理解当hello消息存在其他握手消息时,如何检测扩展部分的存在和边界他们之后的消息。
任何有关如何解析这些数据包的帮助或建议都将不胜感激。
答案 0 :(得分:2)
属于(hanshake协议,更改密码规范协议,警报协议,其他协议)的每个TLS消息都在记录层协议内(或以上)发送。看看这个:https://technet.microsoft.com/en-us/library/cc767139.aspx
记录层协议将提供:
每个TLS消息都将以这些字段开头,即使您在同一TCP段的有效负载中看到许多SSL消息也是如此。您可以将这些消息解析为单独的TLS消息。
SSL记录协议中的长度将为您提供上层协议消息的总长度。如果它是握手协议的一部分的Hello消息,它将包括扩展。此字段还可以让您确定边界或许多TLS消息。
对于Hello消息,在压缩方法字段之后,您有2个八位字节指示扩展长度。扩展包含在包含Hello消息的SSL记录协议的Length字段中。它们也包含在同一Hello消息的长度中。
在SSL记录层之后,不同协议的每条消息都以自己的方式解析:
因此,当您在同一TCP段中有许多TLS消息汇总时,您总是:
Offset = 0
While more data (based on TCP payload length):
Read first 5 octets at Offset
Obtain Length field (Assign to MessageLength, Offset += 5)
Process first TLS message from Offset, with length MessageLength
Offset += MessageLength
我希望我能正确地解决你的问题......