14

HttpsURLConnection我正在尝试使用我自己的信任管理器设置 SSL(使用 SSL 恢复) 。

我只能执行 ssl 握手和连接。没有 SSL 恢复- 以前的会话永远不会重用!

我到处搜索,但没有运气。所有答案都参考 HttpClient (这不是一个选项)。

我的设置如下:

  • 我创建了一个 SSL 上下文以供以后使用。

  • 然后,我使用这个 SSL 上下文创建一个 SSL 工厂,我还存储它以供所有连接使用。

  • 我开始一个一切顺利的连接:我收到一个sessionID,完成了完整的握手并将连接发送到服务器。

  • 一分钟后,我开始另一个连接。出于某种奇怪的原因,这个连接没有发送sessionID我之前的。我打印SSLContext's session - 最后一个 session 仍然存在并且有效。由于某种原因,这个新连接不使用它,因此创建了另一个会话并将其添加到会话的缓存中。

我在 2 个不同的设备上同时尝试了 android 版本 2.3 和 4.1。

在许多谷歌搜索结果之后,我什至尝试添加一些用户建议的 Keep-Alive,以及其他导致没有不同结果的巫术。

有人遇到过这个吗?有什么我想念的吗?

什么可能导致我的连接不使用最后一个会话?

提前致谢!

4

1 回答 1

9

您想要做的是使用reflection覆盖类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 回答