SSL数据包末尾的额外字节(超出数据包长度)

时间:2012-11-22 06:44:01

标签: ssl openssl

我的应用程序使用SSL over SMTP。 但是我最后遇到了额外字节的问题。

我收到的数据包如下:( SSL记录包的十六进制转储)

17 03 01 01 00 9A 07 74 E3 4B E0 07 17 71 38 BF 29 7E 70

E9 14 CC B1 97 77 4C B9 AB A0 9F 88 7B D4 ED 14 8E 97 F2

5A BE 46 56 D4 12 BC 15 01 49 EE CE A1 ED 3F D3 6E 7F AA

DC 6B DF 41 11 74 7B 55 B8 D3 3E 8D EF 96 52 B0 BD 50 35

09 E7 2A FF 0E 39 58 C7 91 99 95 22 6F B0 73 57 28 B4 EA

C6 28 4C DC 5C DA 6C 31 FB 63 71 7D 08 F0 DD 78 C4 08 C5

27 90 04 C7 09 59 E4 83 F4 4D 9A 7B 65 E9 AF 38 44 B4 CD

9E 4D BE 80 0D 07 24 8D C3 79 99 DC 02 81 D7 97 21 16 0B

28 44 82 ED E4 5F E6 91 81 A5 28 C1 C8 92 60 36 4E DE 27

AF D0 2B EE FB 9D 12 9C 2B 4F 3F 29 F2 04 8F DC 21 39 4F

80 23 7E 78 3C A0 29 E0 67 E7 9F 90 B6 1F D4 08 63 3E CE

73 E1 17 72 8D B1 8C 3D A8 59 C0 0F 03 59 7A A6 5D F9 7A

40 57 D6 8D 94 48 93 BF D8 17 C6 70 79 36 13 D0 F1 D1 D2

69 D4 05 9D 67 86 6D E9 66 D0 83 4A D8 5E 20

从SSL 3.1协议看,此数据包的长度为256字节。 但最后还有一个额外的字节(最后以粗体显示)。

由于末尾的这个额外字节,当读取下一个数据包时,也会读取此20并导致错误 SSL_R_WRONG_VERSION_NUMBER (我正在使用OpenSSL Library for SSL)。 我收到的下一个数据包就像(根据数据包嗅探器) 17 03 01 00 18 ...

但是当下一次读取完成后,OpenSSL会将数据包读取为20 17 03 01 ..这会导致错误(因为03 03是03 01的错误版本)

我想知道这是否(最后的额外字节)是SSL标准的一部分。 请建议我如何在OpenSSL中处理这种情况。 OpenSSL版本是1.0.0。

2 个答案:

答案 0 :(得分:1)

没有。额外字节不是SSL标准的一部分。

根据SSL标准(TLS 1.0的RFC 2246,TLS 1.2的最新版本为RFC 5246),SSL的记录如下:

struct {
    ContentType type;
    ProtocolVersion version;
    uint16 length;
    select (CipherSpec.cipher_type) {
        case stream: GenericStreamCipher;
        case block:  GenericBlockCipher;
    } fragment;
} TLSCiphertext;

该片段将完全符合uint16 length成员指定的长度。因此,20必须由服务器实现错误地插入,或者当数据在网络中时,中间的某些其他软件插入它。

Openssl准确读取uint16 length成员指定的字节数,这就是它不读取的原因。

您可以关注的一些要点是:
1.这是否发生在握手后立即传输的第一个应用程序数据包? (从我假设此数据包转储的内容类型是应用程序数据)
这是随机发生的吗?与该特定服务器的所有连接是否都表现出相同的行为? 3.您可以尝试获取在服务器上发送的数据包的转储,以查看在服务器端本身发送数据包时是否存在20,或者在数据传输期间添加数据包。 4.是否存在与防火墙相关的问题? (我不知道防火墙,所以这里没有提供更多细节)

希望这有帮助!

答案 1 :(得分:-1)

今天我正在用这个抨击我的头;终于诉诸于此:

_sslStream.Write(merged,0,merged.Length - 1)

问题解决了,继续前进!