我正在尝试使用HttpsURLConnection
和我自己的信任管理器设置SSL(使用SSL恢复)。
我只能进行ssl握手和连接。 无SSL恢复 - 以前的会话永远不会重复使用!
我搜索了一遍,但没有运气。 所有答案都是指HttpClient(这不是一个选项)。
我的设置如下:
我创建了一个SSL上下文,我将其存储供以后使用。
然后我使用这个SSL上下文创建一个SSL工厂,我也存储它以供所有连接使用。
我开始连接一切顺利:
我收到sessionID
,完成了完整的握手,并将连接发送到服务器。
sessionID
。
我打印SSLContext
的会话 - 最后一个会话仍在那里并且有效。
由于某种原因,此新连接不使用它,因此会创建另一个会话并将其添加到会话缓存中。我在两个不同的设备上同时尝试了Android版本2.3和4.1。
根据谷歌的许多结果,我甚至试图像一些用户提议的那样添加Keep-Alive,以及导致没有不同结果的其他伏都教。
有没有人碰到这个?有什么我想念的吗?
什么可能导致我的连接不使用上一个会话?
提前致谢!
答案 0 :(得分:9)
您要做的是使用reflection
覆盖班级android.net.SSLCertificateSocketFactory
中的成员,成员是:
HOSTNAME_VERIFIER
mTrustManagers
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可能做的任何更改。
希望它有所帮助!祝你好运!