2010-12-02 100 views
5

我目前正在参加关于安全和密码学的大学课程,我们正在执行的其中一个项目涉及实施基本TLS套接字。了解TLS/SSL协议

因此,我研究了使用我的教科书以及最新的RFC的TLS协议,因此我对TLS/SSL的工作原理以及TLS记录格式的布局有了很好的理解,字节逐字节。

因此,首先我决定编写一个服务器程序,它侦听端口443并接受传入的安全HTTP连接。它所做的只是接受客户端连接,然后打印出由客户端发送的初始消息的十六进制转储。

但是当我使用网络浏览器(Firefox)连接到我的服务器时,我完全被浏览器发送给我的字节流困惑。 According to the RFC,TLS客户端必须做的第一件事是发送ClientHello消息。所有消息都必须在TLS记录格式,这是应该这样被格式化被封装(使用C-ISH符号的RFC使用):

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协议的某些部分?

回答

9

你看到的是SSL版本2兼容你好。看看appendix E of RFC 5246。我不相信最新版本的firefox会发送它,他们只会发送你期待的V3 hello格式。