我目前正在上一门关于安全和密码学的大学课程,我们正在做的一个项目涉及实现一个基本的TLS套接字。
因此,我已经使用我的教科书和最新的RFC学习了TLS协议,所以我对TLS/SSL的工作原理以及TLS记录格式是如何逐字节进行布局有了很好的理解。
因此,开始时,我决定编写一个服务器程序,该程序侦听端口443并接受传入的安全HTTP连接。它所做的一切就是接受客户端连接,然后打印出客户端发送的初始消息的十六进制转储。
但是当我使用网页浏览器(Firefox)连接到我的服务器时,浏览器发送给我的字节流让我完全迷惑了。According to the RFC,客户端必须做的第一件事就是发送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协议的某些部分?
发布于 2010-12-03 09:13:43
您看到的是SSL版本2兼容的hello。看看appendix E of RFC 5246吧。我不相信最新版本的火狐会发送这个,他们只会发送你所期待的V3问候格式。
发布于 2010-12-03 07:03:09
Wireshark有一个用于HTTPS/TLS/SSL的解析器,这将能够理解握手的纯文本部分。
还要确保读取The First few milliseconds of an HTTPS connection。
https://stackoverflow.com/questions/4340492
复制相似问题