HttpsURLConnection:SSL恢复无法正常工作

时间:2013-01-15 12:23:43

标签: android ssl https

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

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

我搜索了一遍,但没有运气。 所有答案都是指HttpClient(这不是一个选项)。

我的设置如下:

  • 我创建了一个SSL上下文,我将其存储供以后使用。

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

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

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

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

根据谷歌的许多结果,我甚至试图像一些用户提议的那样添加Keep-Alive,以及导致没有不同结果的其他伏都教。

有没有人碰到这个?有什么我想念的吗?

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

提前致谢!

1 个答案:

答案 0 :(得分:9)

您要做的是使用reflection覆盖班级android.net.SSLCertificateSocketFactory中的成员,成员是:

  1. HOSTNAME_VERIFIER
  2. mTrustManagers
  3. mKeyManagers
  4. 通过上课来做到这一点:

    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可能做的任何更改。

    希望它有所帮助!祝你好运!