【问题标题】:HttpsURLConnection: SSL resumption not workingHttpsURLConnection:SSL 恢复不起作用
【发布时间】:2012-12-29 13:08:30
【问题描述】:

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

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

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

我的设置如下:

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

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

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

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

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

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

有人遇到过这个吗?我有什么遗漏吗?

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

提前致谢!

【问题讨论】:

    标签: android ssl https


    【解决方案1】:

    您想要做的是使用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 可能进行的任何更改。

    希望对您有所帮助!祝你好运!

    【讨论】:

    • 确保 Android 代码在执行此操作时未使用 Apache lib,因为它没有任何效果。此外,您能否详细说明这不适用于哪些设备?
    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多