【发布时间】:2014-08-18 13:26:33
【问题描述】:
有没有办法禁止在客户端和服务器端的 Java 的 SSL 库中重新握手?
我已经搜索了 SSLContext、SSLParameters、SSLSocket、SSLServerSocket 及其对应工厂的 Javadocs,但没有找到解决方案。
【问题讨论】:
标签: java sockets ssl handshake jsse
有没有办法禁止在客户端和服务器端的 Java 的 SSL 库中重新握手?
我已经搜索了 SSLContext、SSLParameters、SSLSocket、SSLServerSocket 及其对应工厂的 Javadocs,但没有找到解决方案。
【问题讨论】:
标签: java sockets ssl handshake jsse
我不知道(简单)好的解决方案,但我找到了一个不好的解决方案。
事实证明,在 2009 年,在影响 SSL 重新协商(或重新握手)的 SSL 协议中发现了一个安全漏洞。 Java 团队分两个阶段解决了这个问题(如here. 所述)。第一阶段是禁用重新协商...这是在 Java 6 补丁 19 中完成的。第二阶段是实现新 RFC 中指定的重新协商协议更改。
因此,禁用 SSL 重新协商的一种方法是将您的 JVM 降级到 Java 6 补丁 19。
坦率地说,我认为这是一个非常糟糕的主意:
但是,如果这让你从一个非常深的洞里挖出来,你可能会考虑它。
好吧,我查看了SSLEngineImpl (here) 的源代码,并没有看到基于此的直接解决方案。寻找kickstartHandshake 方法。
有几个属性可以启用/禁用不安全的重新协商形式(为了兼容性),但没有属性可以完全关闭它。由于完成所有工作的方法是 private,我认为您不能通过覆盖子类中的方法来禁用重新协商功能。
因此,您可能需要复制代码、修改代码以禁用重新协商、更改包名称并创建 SSL 引擎的替代“提供者”。
只是为了进一步混淆......在SSLSocketImpl类(here)中还有另一个SSL协议实现。我没有试图弄清楚这两种实现中的哪一种是您“默认”获得的。
【讨论】:
要回答您的真实问题,该问题出现在对另一个答案的评论中,是的,您可以在重新握手期间继续发送数据。
【讨论】: