HttpsURLConnection:SSL恢复无法正常工作

Bra*_*tos 14 ssl https android

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

我只能进行ssl握手和连接.没有SSL恢复 - 之前的会话永远不会被重用!

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

我的设置如下:

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

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

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

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

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

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

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

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

提前致谢!

Ass*_*iel 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*/);
Run Code Online (Sandbox Code Playgroud)

然后:

用你自己的变量覆盖这些.这将允许Android API 14及更高版本的SSL恢复(我在14上测试过).

谨防

您需要维护此代码并跟上Google可能执行的任何更改.

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