2

我正在尝试使用 ftp4j lib 从具有 TLS 的 FileZilla FTP 服务器获取文件列表。

import it.sauronsoftware.ftp4j.FTPClient;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Arrays;

public class FTP {

    public static void main(String args[]) throws Exception {
        System.setProperty("http.protocols", "TLSv1,TLSv1.1,TLSv1.2"); 
        //tried to avoid closing connection during the handshake

        //load and set certificate
        KeyStore keyStore = KeyStore.getInstance("JKS");
        keyStore.load(new FileInputStream("mykeystore.jks"), "root12".toCharArray());

        FTPClient client = new FTPClient();

        SSLContext sslContext = null;
        try {
            javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory
                    .getInstance(javax.net.ssl.KeyManagerFactory
                            .getDefaultAlgorithm());
            tmf.init(keyStore);
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
        } catch (Exception e) {
            e.printStackTrace();
        }

        SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        client.setSSLSocketFactory(sslSocketFactory);
        client.setSecurity(FTPClient.SECURITY_FTPES);

        client.setCharset("UTF-8");
        client.setPassive(true);
        String[] arg = client.connect("localhost", 21);
        System.out.println(Arrays.toString(arg));

        client.login("admin", "pass"); //OK
        client.noop(); // aka Ping is OK
        String s = client.currentDirectory(); //OK
        client.changeDirectory("/"); //OK
        String[] files = client.listNames(); //Exception here
        System.out.println(Arrays.toString(files));
        client.disconnect(true);
    }
}

我有一个例外

线程“main”中的异常 it.sauronsoftware.ftp4j.FTPException [code=450, message= TLS 数据连接会话未恢复或会话与控制连接不匹配] 在 it.sauronsoftware.ftp4j.FTPClient.listNames(FTPClient .java:2407) 在 FTP.main(FTP.java:49)

我尝试使用主动模式,但也无济于事(ping 命令后失败)

线程“main”中的异常 it.sauronsoftware.ftp4j.FTPException [code=421,message= Rejected command,请求的 IP 地址与控制连接 IP 不匹配。]

您能否回答我做错了什么或者 ftp4j 库实际上支持 FTPES 和 TLS 吗?

FileZilla 服务器 TLS 配置的屏幕截图:

FileZilla TLS 配置

4

2 回答 2

1

ftp4j 库确实支持 FTPS/TLS。如果不是这样,你一开始就不会得到错误。

FileZilla FTP 服务器是 FTP 服务器之一,它要求客户端重用来自 FTP 控制连接的 TLS/SSL 会话进行数据连接:
https ://svn.filezilla-project.org/filezilla?view=revision&revision=6661

这使攻击者更难劫持数据连接,从而提高了安全性。

我不知道,如果 ftp4j 支持重用这个。

替代解决方案是:

  • 使用来自 Apache Commons Net 库的 Java FTP 客户端。虽然它本身不支持重用,但添加支持很容易。请参阅如何使用相同的 TLS 会话通过数据连接连接到 FTPS 服务器?
  • 当您拥有 FTP 服务器时,您可以禁用重用要求。请参阅使用 PROT P选项时需要 TLS 会话恢复数据连接(在您的屏幕截图上)。虽然如上所述,但它对安全性有一些影响。
于 2017-11-10T17:05:30.787 回答
0

在此处输入图像描述

尝试删除它对我有帮助的此复选框。

于 2017-11-13T14:10:43.790 回答