FTP4j не может использовать FTPES (сеанс TLS подключения к данным не возобновлен или сеанс не соответствует управляющему подключению)

Я пытаюсь использовать ftp4j lib для получения списка файлов с FTP-сервера FileZilla с 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) на FTP.main (FTP.java:49)

Я пробовал использовать активный режим, но это тоже не помогает (не удалось после команды ping)

Исключение в потоке "main" it.sauronsoftware.ftp4j.FTPException [code = 421, message = Rejected command, запрошенный IP-адрес не соответствует IP-адресу управляющего соединения.]

Не могли бы вы ответить мне, что я сделал не так, или библиотека ftp4j действительно поддерживает FTPES и TLS?

Скриншоты с конфигурацией TLS сервера FileZilla:

Конфигурация FileZilla TLS


person Limmy    schedule 10.11.2017    source источник


Ответы (2)


Библиотека ftp4j поддерживает FTPS / TLS. Если бы это было не так, вы бы вообще не получили ошибку.

FTP-сервер FileZilla - это один из FTP-серверов, который требует, чтобы клиенты повторно использовали сеанс TLS / SSL из управляющего FTP-соединения для подключений к данным:
https://svn.filezilla-project.org/filezilla?view=revision&revision=6661

Это повышает безопасность, поскольку злоумышленнику становится труднее захватить соединение для передачи данных < / а>.

Я не знаю, поддерживает ли ftp4j повторное использование.

Альтернативные решения:

person Martin Prikryl    schedule 10.11.2017
comment
Второе решение не подходит, в моем случае я не могу изменить настройки ftp-сервера. И первый слишком сложный (переход на apache lib), поэтому он должен быть разумным (например, некоторые доказательства того, что ftp4j не поддерживает TLS) - person Limmy; 11.11.2017
comment
Я не говорил, что ftp4j не поддерживает TLS. Конечно, поддерживает. - person Martin Prikryl; 11.11.2017
comment
Вы знаете, почему мой код не работает с filezilla? - person Limmy; 12.11.2017
comment
Потому что он не использует повторно сеанс TLS управляющего соединения для передачи данных. Я считаю, что мой ответ довольно четко об этом говорит. - person Martin Prikryl; 12.11.2017
comment
Подтверждено разработчиком fpt4j, что невозможно повторно использовать сеанс с этой библиотекой - person Limmy; 21.11.2017

введите описание изображения здесь

Попробуй убрать этот флажок, мне это помогло.

person damir9991    schedule 13.11.2017
comment
Это обходной путь, но не решение (в моем случае я не могу изменить настройки удаленного сервера) - person Limmy; 13.11.2017
comment
Более того, я уже высказал это в своем ответе, поэтому ваш ответ не несет ничего нового. - person Martin Prikryl; 13.11.2017