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

标签 ssl openssl

我的应用程序在 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 协议(protocol)来看,此数据包的长度为 256 字节。 但是末尾有一个额外的字节(末尾以粗体显示)。

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

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

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

最佳答案

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

根据 SSL 标准(RFC 2246 for TLS 1.0,最新的是 RFC 5246 for TLS 1.2),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. 是否存在与防火墙相关的问题? (我对防火墙一无所知,所以这里没有给出更多细节)

希望这对您有所帮助!

关于ssl - SSL 数据包末尾的额外字节(超出数据包的长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507172/

相关文章:

c++ - OpenSSL:将不安全的 BIO 提升为安全的 BIO

web-applications - 如何从 Java EE Web 应用程序枚举 HTTP 监听器

authentication - 在具有动态 IP 的开发服务器上设置 SSL

.htaccess 和 SSL 并重定向到 index.php

ubuntu - OpenSSL SSL_ERROR_SYSCALL 连接到 raw.githubusercontent.com :443

ruby-on-rails - 如何使用 CloudHSM 在 Ruby 中实现双向 TLS(客户端)

c - 无法使用 OpenSSL 库/函数编译代码

curl - SSL证书错误

ruby - 连接:SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

java - 在 node 中加密并在 java 中解密