java - JDK 8u161 中 Apache FTPS 客户端中的 SSL session 重用

标签 java ftp ftps apache-commons-net

<分区>

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

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

  • 缺乏安全感
  • 并不总是一个选项(因为服务器可能不在您的控制之下)

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

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

在 JDK 8u161 和 9.0.4 (?) 之前,这个 hack 工作得很好,其中引入了一些对 SSL 的更改,这些更改在 changelog 中描述。 .显然,一些实现细节已经改变,导致 hack 不再有效。

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

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

谁能建议如何在这里进行?


相关链接:

最佳答案

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

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

jdk.tls.useExtendedMasterSecret

false 来做到这一点。

有两种方式:

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

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

关于java - JDK 8u161 中 Apache FTPS 客户端中的 SSL session 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49257998/

相关文章:

node.js - 如何使用node连接ftp并上传文件

php - FTPS 问题 : "A TLS packet with unexpected length was received."

java - Java是如何实现接口(interface)多态的?

java - 什么是 Resteasy 3.X PreProcessInterceptor 的正确替代品?

c# - 远程服务器返回错误 : 227 Entering Passive Mode (500 oops vs_utility_recv_peek: no data)

Python 3.6 ftps 文件下载 - SSLEOFError : EOF occurred in violation of protocol (_ssl. c:841)

java - 如何使用java检查sqlite中是否存在与数据库的连接?

java - 我想在jsp中每页显示数据库10个结果

ftp - PHPStorm,自动上传: always overwriting

PHP FTP上传到特定文件夹