在TLS协议中解析扩展问候消息的正确方法是什么?

时间:2015-07-27 14:08:58

标签: parsing ssl network-programming wireshark

根据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完全相同),其中包含扩展程序,CertificateServerHelloDone消息。

当Hello消息被封装在单个握手消息中时,检测Hello扩展很容易,但我无法理解当hello消息存在其他握手消息时,如何检测扩展部分的存在和边界他们之后的消息。

任何有关如何解析这些数据包的帮助或建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

属于(hanshake协议,更改密码规范协议,警报协议,其他协议)的每个TLS消息都在记录层协议内(或以上)发送。看看这个:https://technet.microsoft.com/en-us/library/cc767139.aspx

记录层协议将提供:

  • 内容类型(1个八位字节)
  • 版本(2个八位字节)
  • 长度(2个八位位组)

每个TLS消息都将以这些字段开头,即使您在同一TCP段的有效负载中看到许多SSL消息也是如此。您可以将这些消息解析为单独的TLS消息。

SSL记录协议中的长度将为您提供上层协议消息的总长度。如果它是握手协议的一部分的Hello消息,它将包括扩展。此字段还可以让您确定边界或许多TLS消息。

对于Hello消息,在压缩方法字段之后,您有2个八位字节指示扩展长度。扩展包含在包含Hello消息的SSL记录协议的Length字段中。它们也包含在同一Hello消息的长度中。

在SSL记录层之后,不同协议的每条消息都以自己的方式解析:

  • 更改密码规范协议:始终为1个Octet
  • 握手协议:TLV(类型,长度,值)
  • 警报协议:2个八位字节(级别,警报)
  • HTTP或其他......

因此,当您在同一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

我希望我能正确地解决你的问题......