代码之家  ›  专栏  ›  技术社区  ›  GILGAMESH

Gmail SMTP使用十六进制15 03 01 00 02 02 16关闭ClientHello上的套接字

  •  0
  • GILGAMESH  · 技术社区  · 7 年前

    我正在构建自己的SMTP客户端(使用WinAPI中的C++,但这不重要)。首先,我连接到smtp。gmail。端口25处的com。它响应

    220 smtp.gmail.com ESMTP f191sm4468458ite.4 - gsmtp

    我发送 EHLO 消息,然后我收到

    250-smtp.gmail.com at your service, [<I blocked out my IP here>]
    250-SIZE 35882577
    250-8BITMIME
    250-STARTTLS
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8
    

    现在,我发送 STARTTLS 。答复:

    220 2.0.0 Ready to start TLS
    

    看起来不错,所以现在我假设首先按照中的指定发送ClientHello RFC5246 。因此,我发送以下十六进制数(将其编码为字节后):

    03 03 5a 9e 49 ff
    

    前两个应该是ProtocolVersion,两个uint8字节 3 3. 。然后,接下来的四个字节应该是当前的UTC客户机纪元时间,作为big-endian中的UNIX uint32。但在我开始发送ClientHello的其余部分之前,Gmail的SMTP立即关闭了套接字

    15 03 01 00 02 02 16
    

    我不知道如何在RFC或其他方面找到有关此错误的信息。它似乎不是警报,因为RFC状态警报应以1或2字节开头。Gmail的SMTP响应意味着什么?我的前6个字节做错了什么?

    1 回复  |  直到 3 年前
        1
  •  3
  •   Community CDub    3 年前

    根据 RFC 5246 Section 6.2.1 ,消息的结构为

    struct {
        uint8 major;
        uint8 minor;
    } ProtocolVersion;
    
    enum {
        change_cipher_spec(20), alert(21), handshake(22),
        application_data(23), (255)
    } ContentType;
    
    struct {
        ContentType type;
        ProtocolVersion version;
        uint16 length;
        opaque fragment[TLSPlaintext.length];
    } TLSPlaintext;
    

    使用此方法,可以将接收到的消息解释为

    15 : type = alert
    03 : version.major = 3
    01 : version.minor = 1
    00
    02 : length = 2
    02 : fragment[0] = 0x02
    16 : fragment[1] = 0x16
    

    现在您可以使用 RFC 5246 Section 7.2 用于解码片段部分。

    02 : level = fatal
    16 : description = record_overflow
    

    您的错误似乎是您发送的 ClientHello 不用包装 TLSPlaintext

    当我试着解释的时候 03 03 5a 9e 49 ff TLSPlaintext ,它将是

    03 : type = ?
    03 : version.major = 3
    5a : version.minor = 90
    9e
    49 : length = 0x9e49
    ff : fragment[0] = 0xff
    

    根据以下描述 record_overflow 在里面 RFC 5246 Section 7.2.2 , length 字段不能超过2^14+2048字节,但0x9e49超出了此限制。这应该是您出现此错误的原因。