14

HttpsURLConnection独自のトラスト マネージャーを使用して SSL (SSL 再開あり) をセットアップしようとしています。

SSL ハンドシェイクと接続しか実行できません。SSL 再開なし- 以前のセッションが再利用されることはありません。

あちこち探しましたが、運がありませんでした。すべての回答は HttpClient を参照しています (これはオプションではありません)。

私のセットアップは次のとおりです。

  • 後で使用するために保存する SSL コンテキストを作成します。

  • 次に、この SSL コンテキストを使用して SSL ファクトリを作成します。この SSL コンテキストは、すべての接続で使用できるように保存します。

  • すべてがうまくいく接続を開始します。 を受け取り、sessionID完全なハンドシェイクが行われ、接続がサーバーに送信されます。

  • 1 分後、別の接続を開始します。奇妙な理由で、この接続はsessionID以前に持っていた を送信しません。のセッションを印刷しますSSLContext- 最後のセッションはまだそこにあり、有効です。何らかの理由で、この新しい接続はそれを使用しないため、別のセッションが作成され、セッションのキャッシュに追加されます。

Android バージョン 2.3 と 4.1 の両方を 2 つの異なるデバイスで試しました。

多くのGoogleの結果に続いて、何人かのユーザーが提案したようにKeep-Aliveを追加しようとさえしました.

誰かがこれに遭遇しましたか?足りないものはありますか?

接続が最後のセッションを使用しない原因は何ですか?

前もって感謝します!

4

1 に答える 1

9

あなたがしたいのはreflection、 class のメンバーをオーバーライドするために使用することですandroid.net.SSLCertificateSocketFactory。メンバーは次のとおりです。

  1. HOSTNAME_VERIFIER
  2. mTrustManagers
  3. mKeyManagers

クラスを取得してそれを行います:

Class<?> sslClass = Class.forName("android.net.SSLCertificateSocketFactory");
Field classField = sslClass.getDeclaredField("defaultTrustManager");
classField.setAccessible(true);
classField.set(null /*If Feild is static*/, youObjectHere /*Needs casting*/);
classField.set(objectInstance /*If Feild is not static*/, youObjectHere /*Needs casting*/);

その後:

これらを独自の変数でオーバーライドします。これにより、Android API 14 以降の SSL 再開が可能になります (私は 14 でテストしました)。

注意してください

このコードを維持し、Google による変更に対応する必要があります。

それが役に立ったことを願っています!幸運を!

于 2013-02-05T15:13:02.617 に答える