【问题标题】:SSL Session reuse in Apache FTPS client in JDK 8u161 [duplicate]JDK 8u161中Apache FTPS客户端中的SSL会话重用[重复]
【发布时间】:2018-08-21 19:36:38
【问题描述】:

使用 Apache Commons-Net 的 FTPSClient 连接到现代 FTP/S 服务器不起作用。原因是它们需要 SSL 会话重用,即来自控制连接的 SSL 会话需要重用于数据连接。

这通常可以在服务器中停用,但那是

  • 不安全
  • 并非总是一种选择(因为服务器可能不受您的控制)

正确的解决方案是让客户端真正重用会话。 Commons-Net 有一个open bug,但它看起来不会很快得到解决。

此外,还有一个由 Cyber​​duck(一个 FTP 客户端应用程序)的作者创建的“反射黑客”,在 in their bugtracker 以及更深入的 blog post 中进行了描述。还有一个相关的post on StackOverflow 描述了这个解决方案。他们使用反射来访问JDK的SSLSessionContext的内部缓存并注入一个新条目。

在 JDK 8u161 和 9.0.4 (?) 之前,此 hack 一直运行良好,其中引入了一些 SSL 更改,这些更改在 changelog 中进行了描述。显然,一些实现细节已经改变,导致黑客不再起作用。

据我所知,现在有以下几种选择:

  • 继续使用 JDK 8u152,直到有人找到解决方案/apache-commons-net 得到修补/JDK 更改被回滚(这不是一个真正的选择,因为这会切断生产系统的安全更新)
  • 使用不同的 FTPS 客户端(我能找到的唯一替代方案是专有的并且非常昂贵)
  • 尝试对SSLSessionContext 实现的更改进行逆向工程以找到新的解决方法。这不仅看起来像是一项艰巨的任务 - 解决方案可能会再次变得老套,因此随时可能再次崩溃。
  • 不要再使用 FTP/S

任何人都可以建议如何在这里进行吗?


相关链接:

【问题讨论】:

  • 这不应被标记为重复;这个问题引用了另一个问题并解释了它如何在 8u161 中不再起作用。

标签: java ftp ftps apache-commons-net


【解决方案1】:

描述了一个可能的解决方案here

本质上,它将改变的行为从 JDK8u161 恢复到以前的工作方式。需要设置系统属性

jdk.tls.useExtendedMasterSecret

false 这样做。

有两种方式:

  • 在启动 FTP/S 连接之前调用System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
  • 使用 java -Djdk.tls.useExtendedMasterSecret=false [...] 将属性传递给您的 java 进程

请记住,此解决方案会禁用 JVM 范围内的安全增强功能 - 请谨慎操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2014-10-15
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多