使用 Apache commons-net 的 Java FTPSClient 进行会话恢复是一个已知问题。会话恢复是 FTPS 服务器数据连接所需的一项安全功能。Apache FTPSClient 不支持会话恢复,并且 JDK API 使得构建自定义实现变得困难。有一些使用反射的解决方法,请参阅此答案和此commons-net bug 条目。
我在 JDK 11 中使用了这样的解决方法(请参阅下面的片段),并针对本地 FileZilla 服务器对其进行了测试。它适用于 FileZilla Server 0.9.6,但不适用于 FileZilla Server 1.2.0,这是撰写本文时的最新版本。在该版本中,当尝试建立数据连接时,服务器会响应:
425 Unable to build data connection: TLS session of data connection not resumed.
Run Code Online (Sandbox Code Playgroud)
正如我所说,FileZilla Server 0.9.6 适合我进行会话恢复的方式,并且我确保激活了要求会话恢复的设置。
在 FileZilla Server 1.2.0 中,此类设置现在是隐式设置的,无法通过 GUI 更改,也许根本不能更改。我可以调整一些服务器设置才能使其正常工作吗?或者是我如何实施解决方法的问题?有人遇到类似的问题吗?
这是我正在使用的解决方法:
public class FTPSClientWithSessionResumption extends FTPSClient {
static {
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
System.setProperty("jdk.tls.client.enableSessionTicketExtension", "false");
}
@Override
protected void _connectAction_() throws IOException {
super._connectAction_();
execPBSZ(0);
execPROT("P"); …Run Code Online (Sandbox Code Playgroud)