【问题标题】:Forbid SSL rehandshake in Java (JSSE)?在 Java (JSSE) 中禁止 SSL 重新握手?
【发布时间】:2014-08-18 13:26:33
【问题描述】:

有没有办法禁止在客户端和服务器端的 Java 的 SSL 库中重新握手?

我已经搜索了 SSLContext、SSLParameters、SSLSocket、SSLServerSocket 及其对应工厂的 Javadocs,但没有找到解决方案。

【问题讨论】:

    标签: java sockets ssl handshake jsse


    【解决方案1】:

    我不知道(简单)好的解决方案,但我找到了一个不好的解决方案。

    事实证明,在 2009 年,在影响 SSL 重新协商(或重新握手)的 SSL 协议中发现了一个安全漏洞。 Java 团队分两个阶段解决了这个问题(如here. 所述)。第一阶段是禁用重新协商...这是在 Java 6 补丁 19 中完成的。第二阶段是实现新 RFC 中指定的重新协商协议更改。

    因此,禁用 SSL 重新协商的一种方法是将您的 JVM 降级到 Java 6 补丁 19。

    坦率地说,我认为这是一个非常糟糕的主意:

    • 您正在回退到已停产的 Java 版本。
    • 您正在退出一整套安全补丁。
    • 如果您已经开始使用 Java 7 或 Java 8 语言/库功能,那么您需要做额外的工作。

    但是,如果这让你从一个非常深的洞里挖出来,你可能会考虑它。


    好吧,我查看了SSLEngineImpl (here) 的源代码,并没有看到基于此的直接解决方案。寻找kickstartHandshake 方法。

    有几个属性可以启用/禁用不安全的重新协商形式(为了兼容性),但没有属性可以完全关闭它。由于完成所有工作的方法是 private,我认为您不能通过覆盖子类中的方法来禁用重新协商功能。

    因此,您可能需要复制代码、修改代码以禁用重新协商、更改包名称并创建 SSL 引擎的替代“提供者”。

    只是为了进一步混淆......在SSLSocketImpl类(here)中还有另一个SSL协议实现。我没有试图弄清楚这两种实现中的哪一种是您“默认”获得的。

    【讨论】:

    • 感谢您的努力。只要我可以在重新握手期间继续发送数据,这并不重要。这在 Java 中可行吗?
    • 对不起,我不知道。但我已经链接到源代码(两种风格),让你自己挖掘。
    • 感谢您的所有努力。我会自己挖掘:D
    • @StephenC 你知道我在哪里可以找到实现所有功能的 SSL 引擎吗?
    【解决方案2】:

    要回答您的真实问题,该问题出现在对另一个答案的评论中,是的,您可以在重新握手期间继续发送数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-20
      • 2016-04-02
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多