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, сообщение = отклоненная команда, запрошенный IP-адрес не соответствует IP-адресу управляющего соединения.]

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

Снимки экрана с конфигурацией TLS сервера FileZilla:

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

2 ответа

Решение

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

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

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

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

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

  • Используйте Java FTP-клиент из библиотеки Apache Commons Net. Хотя он не поддерживает повторное использование самостоятельно, добавить поддержку легко. См. Как подключиться к серверу FTPS с подключением к данным, используя тот же сеанс TLS?
  • Поскольку вы являетесь владельцем FTP-сервера, вы можете отключить требование повторного использования. См. Требование возобновления сеанса TLS при подключении к данным при использовании опции PROT P (на скриншоте). Хотя, как уже упоминалось выше, это оказывает определенное влияние на безопасность.

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

Другие вопросы по тегам