1

我的应用程序使用 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 .. 这会导致错误(因为 17 03 是 03 01 的错误版本)

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

4

2 回答 2

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这就是它不读取 20 的原因。

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

希望这可以帮助!

于 2012-12-03T08:08:30.467 回答
-1

我今天用这个砸我的头;最后求助于这个:

_sslStream.Write(合并,0,合并。长度 - 1)

问题解决了,继续!

于 2012-12-13T23:20:19.497 回答