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

我收到的数据包如下:(十六进制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库获取SSL)。
我收到的下一个数据包就像(根据数据包嗅探器)
17 03 01 00 18 ...

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

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

最佳答案

不可以。额外的字节不是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,或者当数据在网络中时,中间的某些其他软件正在插入20。

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

您可以重点关注的几点是:
1.握手后立即传输的第一个应用程序数据包会发生这种情况吗? (根据内容类型,我认为此数据包转储用于应用程序数据)
2.这是随机发生的吗?与该特定服务器的所有连接是否表现出相同的行为?
3.您可以尝试获取在服务器发送的数据包的转储,以查看在服务器端本身发送数据包时或在飞行过程中添加数据包时是否存在20。
4.可能有防火墙相关的问题吗? (我不了解防火墙,因此这里没有提供更多详细信息)

希望这可以帮助!

10-07 12:36
查看更多