3

公式の請求書情報を財政管理局に送信するプログラムを Java で作成しています。この公開サービスは、Web サービスへの SSL 接続で使用し、要求本文メッセージ内のいくつかの特別なデータ フィールドを暗号化するための証明書を提供しました。

クライアントとサーバーが合意された暗号スイート (この場合は TLS_RSA_WITH_AES_128_CBC_SHA) を使用して通信することに同意した後、ハンドシェイク フェーズ中に EOFException エラーが発生します。

SSL プロトコルに従って、クライアントは新しい暗号を使用したテストを正常に実行し、テスト データをサーバーに送信します。これにより、サーバーも同じテストを繰り返し、データの暗号化と復号化もできることを確認できます。この時点で、サーバーは EOFException を送信します。

SSL 通信ログの最後の部分は次のとおりです。

送信したばかりのクライアント証明書に対応する秘密鍵を知っていることを確認して、サーバーに簡単な確認を送信します...

*証明書検証

[書き込み] MD5 および SHA1 ハッシュ: len = 262

ここのバイナリ データが大きすぎて表示されない

メイン、書き込み: TLSv1 ハンドシェイク、長さ = 262

[生書き込み]: 長さ = 267

ここのバイナリ データが大きすぎて表示されない

*サーバーに、新しく確立された暗号スイートに変更することを伝えます。それ以降のすべてのメッセージは、確立したパラメーターを使用して暗号化されます。*

メイン、書き込み: TLSv1 変更暗号仕様、長さ = 1

[生書き込み]: 長さ = 6

0000: 14 03 01 00 01 01

...そして成功して終了

..終了した

暗号化された Finished メッセージを送信して、すべてが機能したことを確認します。

検証データ: { 221, 96, 47, 110, 19, 170, 244, 8, 37, 152, 160, 40 }

... クライアントはテスト データを暗号化します。

[書き込み] MD5 および SHA1 ハッシュ: len = 16

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

ENCRYPTION の前に埋め込まれた平文: len = 48

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

0010: 10 7F 85 11 EC 6D 5D ED 21 70 27 F4 DC 23 C0 9B .....m].!p'..#..

0020: A7 6F C2 80 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B ....................

メイン、書き込み: TLSv1 ハンドシェイク、長さ = 48

* ...そしてテストデータをサーバーに送信して、サーバーが同じテストを実行し、暗号化された通信が確立できることを確認できるようにします (53 バイト = テストデータからの 48 + ヘッダーからの 5) *

[生書き込み]: 長さ = 53

0000: 16 03 01 00 30 1C 17 08 0F 49 C9 6A 7A 8B 8C 48 ....0....I.jz..H

0010: BA 57 2D CB 06 46 1E 65 61 7C 5F 74 F2 08 AB 12 .W-..F.ea._t....

0020: 91 47 72 8C 8F 84 0A CB D7 29 E2 FD 84 B2 FD 9E .Gr......)......

0030: 47 DC 13 60 B4 G..`.

...そしてサーバーは EOFException エラーで応答します

メイン、受信した EOFException: エラー

メイン、例外処理: javax.net.ssl.SSLHandshakeException: リモート ホストが閉じられました

ハンドシェイク時の接続

%% 無効: [セッション 1、TLS_RSA_WITH_AES_128_CBC_SHA]

メイン、SEND TLSv1 ALERT: 致命的、説明 = handshake_failure

ENCRYPTION の前に埋め込まれた平文: len = 32

0000: 02 28 BC 65 1A CA 68 87 79 84 5F 64 16 F5 28 72 .(.e..hy_d..(r

0010: F7 8A 69 72 93 D8 09 09 09 09 09 09 09 09 09 09 ..ir............

メイン、書き込み: TLSv1 アラート、長さ = 32

[生書き込み]: 長さ = 37

0000: 15 03 01 00 20 0D 9A 35 18 B7 98 4B 7B AF 82 4E .... ..5...K...N

0010: 1A EE 7D AC 5D D5 49 05 4E 74 B9 77 E4 CD 87 61 ....].I.Nt.w...a

0020: 23 03 5C 9C 7E #...

メイン、closeSocket() と呼ばれる

メイン、close() と呼ばれる

メイン、closeInternal(true) と呼ばれる

このような失敗の原因となる可能性のあるものと、プロセスのこのステップの結果にプログラムで影響を与える方法についてはわかりません。SSL_RSA_WITH_RC4_128_MD5 など、クライアントとサーバーの両方で認識される他の暗号の使用を強制しようとしましたが、エラーは残ります。この問題を解決する方法について何か考えはありますか?

4

1 に答える 1

2

この問題を解決する方法について何か考えはありますか?

そのサービスを実行している人々と連絡を取り、ログを見て、SSL セットアップ中にサーバーが接続を閉じている理由を確認することをお勧めします。

(厳密に言えば、サーバーは「[an] EOFException エラーで応答しません」。実際には TCP 接続を閉じており、クライアント側の Java ライブラリが例外をスローしています。正しい用語を使用する場合は、サービスを参照してください。)

于 2013-01-15T02:54:17.413 に答える