JDK 8u161 中 Apache FTPS 客户端中的 SSL 会话重用
SSL Session reuse in Apache FTPS client in JDK 8u161
使用 Apache Commons-Net 的 FTPSClient
连接到现代 FTP/S 服务器不起作用。原因是它们需要 SSL 会话重用,即来自控制连接的 SSL 会话需要重新用于数据连接。
这通常可以在服务器中停用,但那是
- 不安全
- 不总是一个选项(因为服务器可能不受您的控制)
正确的解决方案是让客户端实际重用会话。 Commons-Net 有一个 open bug,但看起来不会很快得到解决。
此外,还有一个 "reflection hack" 由 Cyberduck(一个 FTP 客户端应用程序)的作者创建,in their bugtracker and, more in-depth, in a blog post. There is also a related 描述了此解决方案。他们使用反射访问 JDK 的 SSLSessionContext
的内部缓存并注入一个新条目。
此 hack 在 JDK 8u161 和 9.0.4 (?) 之前一直有效,其中引入了一些 SSL 更改,这些更改在 changelog 中进行了描述。显然,一些实施细节已经改变,导致 hack 不再起作用。
据我所知,现在有以下选项:
- 继续使用 JDK 8u152,直到有人发现 solution/apache-commons-net 获得 patched/JDK 更改被回滚(不是真正的选择,因为这会切断生产系统的安全更新)
- 使用不同的 FTPS 客户端(我能找到的唯一替代方案是专有且相当昂贵)
- 尝试对
SSLSessionContext
实施的更改进行逆向工程以找到新的解决方法。这不仅看起来像是一项不平凡的任务 - 解决方案可能会再次出现问题,因此随时可能再次崩溃。
- 不要再使用 FTP/S
有人可以建议如何在这里进行吗?
相关链接:
描述了一个可能的解决方案 。
本质上,它是将更改后的行为从 JDK8u161 恢复到以前的工作方式。您需要设置系统属性
jdk.tls.useExtendedMasterSecret
到 false
做到这一点。
有两种方式:
- 在启动 FTP/S 连接之前调用
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
- 使用
java -Djdk.tls.useExtendedMasterSecret=false [...]
将 属性 传递给您的 java 进程
请记住,此解决方案会禁用安全增强功能 JVM-wide - 请谨慎操作。
使用 Apache Commons-Net 的 FTPSClient
连接到现代 FTP/S 服务器不起作用。原因是它们需要 SSL 会话重用,即来自控制连接的 SSL 会话需要重新用于数据连接。
这通常可以在服务器中停用,但那是
- 不安全
- 不总是一个选项(因为服务器可能不受您的控制)
正确的解决方案是让客户端实际重用会话。 Commons-Net 有一个 open bug,但看起来不会很快得到解决。
此外,还有一个 "reflection hack" 由 Cyberduck(一个 FTP 客户端应用程序)的作者创建,in their bugtracker and, more in-depth, in a blog post. There is also a related SSLSessionContext
的内部缓存并注入一个新条目。
此 hack 在 JDK 8u161 和 9.0.4 (?) 之前一直有效,其中引入了一些 SSL 更改,这些更改在 changelog 中进行了描述。显然,一些实施细节已经改变,导致 hack 不再起作用。
据我所知,现在有以下选项:
- 继续使用 JDK 8u152,直到有人发现 solution/apache-commons-net 获得 patched/JDK 更改被回滚(不是真正的选择,因为这会切断生产系统的安全更新)
- 使用不同的 FTPS 客户端(我能找到的唯一替代方案是专有且相当昂贵)
- 尝试对
SSLSessionContext
实施的更改进行逆向工程以找到新的解决方法。这不仅看起来像是一项不平凡的任务 - 解决方案可能会再次出现问题,因此随时可能再次崩溃。 - 不要再使用 FTP/S
有人可以建议如何在这里进行吗?
相关链接:
描述了一个可能的解决方案
本质上,它是将更改后的行为从 JDK8u161 恢复到以前的工作方式。您需要设置系统属性
jdk.tls.useExtendedMasterSecret
到 false
做到这一点。
有两种方式:
- 在启动 FTP/S 连接之前调用
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
- 使用
java -Djdk.tls.useExtendedMasterSecret=false [...]
将 属性 传递给您的 java 进程
请记住,此解决方案会禁用安全增强功能 JVM-wide - 请谨慎操作。