我的应用程序使用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。
答案 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)
问题解决了,继续前进!