理解TLS/SSL协议

5
我目前正在上一门与安全和加密相关的大学课程,其中一个项目涉及实现基本的TLS套接字。
因此,我使用我的教科书以及最新的RFC研究了TLS协议,所以我对TLS/SSL的工作原理以及TLS记录格式的逐字节布局有很好的理解。
因此,我决定首先编写一个服务器程序,监听端口443并接受传入的安全HTTP连接。它只接受客户端连接,然后打印出客户端发送的初始消息的十六进制转储。
但是当我使用Web浏览器(Firefox)连接到我的服务器时,我被浏览器发送给我的字节流完全困惑了。根据RFC,TLS客户端必须做的第一件事是发送一个ClientHello消息。所有消息都必须封装在TLS记录格式中,该格式应按以下方式格式化(使用RFC使用的C-ish表示法):
  struct {
      ContentType type;
      ProtocolVersion version;
      uint16 length;
      opaque fragment[TLSPlaintext.length];
  } TLSPlaintext;

ContentType字段是一个枚举值,必须是以下类型之一:change_cipher_spec = 0x14, alert = 0x15, handshake = 0x16, application_data = 0x17

因此,由于客户端必须发送ClientHello消息作为握手的一部分,我期望字节流中的第一个字节是0x16,表示这是一个握手消息。

但实际上,浏览器发送的实际字节流是:

80 55 01 03 00 00 3c 00 00 00 10 00 00 88 00 00 87 00 00 39 00 00 
38 00 00 84 00 00 35 00 00 45 00 00 44 00 00 33 00 00 32 00 00 96 
00 00 41 00 00 04 00 00 05 00 00 2f 00 00 16 00 00 13 00 fe ff 00 
00 0a 00 00 ff 07 99 58 ad 17 f3 17 23 be 63 8c 6d cb 9b 5f 6f 

我花了几个小时查看RFC,但我仍然无法理解这个字节流的含义。关于TLS的所有内容都告诉我第一个字节应该是0x16表示握手,接着是两个字节的版本字段和两个字节的记录长度字段。但是这个字节流以0x80 0x55开头,这对我来说毫无意义。
有人能解释一下这里到底发生了什么吗?我是否误解了TLS协议的某些部分?
2个回答

9
你看到的是与SSL版本2兼容的握手消息。请参考RFC 5246附录E。我不认为最新版本的Firefox会发送这个,它们只会发送你期望的V3握手消息格式。

5

Wireshark有一个HTTPS/TLS/SSL解析器,可以理解握手过程中的明文部分。

还要确保阅读HTTPS连接的前几毫秒


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接