1

私のアプリケーションは SSL over SMTP を使用しています。しかし、最後に余分なバイトの問題に直面しました。

受信したパケットは次のとおりです: (SSL レコード パケットの 16 進ダンプ)

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 ダ 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 バイトです。ただし、最後に余分なバイトが 1 つあります (最後に太字で示されています)。

最後にこの余分なバイトがあるため、次のパケットが読み取られるときに、この 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 です。

4

2 に答える 2

1

いいえ。余分なバイトはSSL標準の一部ではありません。

SSL標準(TLS1.0の場合はRFC2246、TLS1.2の場合は最新はRFC5246)に従い、SSLのレコードは次のとおりです。

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

uint16 lengthフラグメントは、メンバーによって指定された長さに正確になります。したがって、20はサーバー実装によって誤って挿入されているか、データがネットワークにあるときに途中にある他のソフトウェアが挿入している必要があります。

OpenSSLは、メンバーによって指定されたバイト数を正確に読み取ります。そのため、Opensluint16 lengthは20を読み取りません。

焦点を当てることができるポイントのいくつかは次のとおり
です。1。これは、ハンドシェイクの直後に転送される最初のアプリケーションデータパケットで発生しますか?(コンテンツタイプから、このパケットダンプはアプリケーションデータ用であると想定しました)
2。これはランダムに発生しますか?その特定のサーバーとのすべての接続は同じ動作を示しますか?
3.サーバーで送信されたパケットのダンプを取得して、パケットがサーバー側で送信されているとき、またはパケットが飛行中に追加されているときに20が存在するかどうかを確認できます。
4.ファイアウォール関連の問題がありますか?(ファイアウォールについては知らないので、ここでは詳しく説明しませんでした)

お役に立てれば!

于 2012-12-03T08:08:30.467 に答える
-1

今日はこれで頭をぶつけていました。最終的にこれに頼った:

_sslStream.Write(結合された、0、結合された.長さ - 1)

問題は解決しました。先に進みましょう。

于 2012-12-13T23:20:19.497 に答える