禁止Java (JSSE)中的SSL重握手



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

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

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

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

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

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

  • 您正在回滚到已EOL的Java版本。
  • 您正在退出整个安全补丁堆栈。
  • 如果你已经开始使用Java 7或Java 8语言/库的功能,你在做额外的工作。

然而,如果这能让你摆脱困境,你可以考虑一下。


嗯,我看了SSLEngineImpl的源代码(这里),我找不到基于此的直接解决方案。查找kickstartHandshake方法。

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

所以你可能需要复制代码,修改它以禁用重新协商,更改包名并创建一个替代的"提供者"SSL引擎。

为了让事情更加混乱…在SSLSocketImpl类中有另一种SSL协议的实现(在这里)。我没有试图找出这两个实现中的哪一个是你得到的"默认"

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

最新更新