FTP4j无法使用FTPES(数据连接的TLS会话未恢复或会话与控制连接不匹配)

时间:2017-11-10 16:21:09

标签: java ftp filezilla ftps ftp4j

我正在尝试使用ftp4j lib从FileZilla FTP servcer获取TLS文件列表。

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)at at   FTP.main(FTP.java:49)

我尝试使用主动模式,但它也没有帮助(ping命令后失败)

  

线程中的异常" main" it.sauronsoftware.ftp4j.FTPException   [code = 421,message =拒绝命令,请求的IP地址没有   匹配控制连接IP。]

你能否回答一下我做错了什么或ftp4j库实际上支持FTPES& TLS?

使用FileZilla服务器TLS配置截图:

FileZilla TLS configuration

2 个答案:

答案 0 :(得分:0)

ftp4j库确实支持FTPS / TLS。如果不是,你不会在第一时间得到错误。

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

通过使攻击者更难以hijack a data connection来增加安全性。

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

替代解决方案是:

  • 使用Apache Commons Net库中的Java FTP客户端。虽然它本身不支持重用,但添加支持很容易。请参阅How to connect to FTPS server with data connection using same TLS session?
  • 当您拥有FTP服务器时,您可以禁用重用要求。使用PROT P 选项时,请参阅要求TLS会话恢复数据连接(在屏幕截图上)。虽然如上所述,但它对安全性有一定的影响。

答案 1 :(得分:0)

enter image description here

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