【问题标题】:Understanding the TLS/SSL protocol了解 TLS/SSL 协议
【发布时间】:2010-12-03 20:25:33
【问题描述】:

我目前正在上大学的安全和密码学课程,我们正在做的一个项目涉及实现一个基本的 TLS 套接字。

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

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

但是当我使用网络浏览器 (Firefox) 连接到我的服务器时,我完全被浏览器发送给我的字节流所迷惑。 According to the 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 协议的某些部分?

【问题讨论】:

    标签: security encryption network-protocols ssl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Wireshark 有一个 HTTPS/TLS/SSL 解析器,这将能够理解握手的纯文本部分。

      还要确保阅读The First few milliseconds of an HTTPS connection。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-26
        • 1970-01-01
        • 2017-04-28
        • 2014-02-02
        • 2015-05-01
        • 2018-05-06
        • 2015-05-29
        • 2016-05-04
        相关资源
        最近更新 更多