当前位置: 首页 > 知识库问答 >
问题:

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

黄意智
2023-03-14

我正在尝试使用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异常[代码=450,消息=TLS数据连接会话未恢复或会话与控制连接不匹配]位于ftp.main(ftp.java:49)的it.sauronsoftware.ftp4j.ftpclient.listnames(ftpclient.java:2407)

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

线程“main”it.sauronsoftware.ftp4j.ftpexception中出现异常[代码=421,消息=被拒绝的命令,请求的IP地址与控制连接IP不匹配。]

你能回答我我做错了什么吗,或者ftp4j库实际上支持FTPE&TLS吗?

共有1个答案

邹德泽
2023-03-14

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

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

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

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

替代解决方案有:

  • 使用Apache Commons Net Library中的Java FTP客户端。虽然它本身不支持重用,但添加支持是很容易的。请参阅如何使用相同的TLS会话通过数据连接连接到FTPS服务器?
  • 由于您拥有FTP服务器,因此可以禁用重用要求。请参阅“使用PROT P选项时需要在数据连接上恢复TLS会话”(在屏幕截图上)。虽然如上所述,但它对安全性有一定影响。
 类似资料:
  • 嗨,我正试图通过ssh隧道连接到服务器上的数据库,但我甚至无法连接Jsch会话。我试图在GWT中作为我的后端代码的一部分来做这件事。这是服务器端代码的实现部分。我对服务器一般不是那么熟悉。通常在端子I类型中: ssh-x username@xxxx.xxx.edu 然后系统提示我输入密码,我输入密码,然后我就进入了。 所以在java中我的代码如下: 我已经双重检查了用户名、密码和主机字符串,它们都

  • 似乎正在发生的事情(这是我第一次处理FTP,尽管我以前处理过普通的FTP),是服务器在控制连接和数据连接上确保身份验证和加密的方式是,在建立控制连接和身份验证的“正常”TLS连接发生之后,每个数据连接都需要客户端与相同的TLS会话进行连接。这对我来说是有意义的,因为它应该如何工作,但Apache Commons Net FTPS实现似乎没有做到这一点。它似乎试图建立一个新的TLS会话,因此服务器拒

  • 问题内容: 一个只有一个数据库的hibernate会话将保持多少个连接? 问题答案: 在给定的时间,给定的会话将仅保留一个连接,您可以使用connect()方法进行访问。 使用reconnect()方法可以更改所使用的连接。

  • 我有一个cordova应用程序,我有一个登录页面和一个登录用户的内页。每当用户会话消失时,它就会请求登录信息。如何防止ths cordova应用程序在重启移动应用程序时删除会话uppon重启或恢复cookie和会话信息?所以登录屏幕不会每次都出现?

  • 我试图使用Spring Cloud的Zuul、Eureka和我自己的服务实现微服务架构。我有多个具有UI和服务的服务,每个服务都可以使用x509安全性对用户进行身份验证。现在我想把祖尔放在那些服务机构的前面。由于Zuul无法将客户端证书转发到后端,我认为下一个最好的方法是在Zuul的前门对用户进行身份验证,然后使用Spring会话在后端服务中复制他们的身份验证状态。我遵循了Dave Syer的教程

  • 我是ElasticSearch的新手,我遵循这里的说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html 每当我运行“docker compose up”时,Kibana总是说“无法恢复连接”,但如果我运行curlhttp://localhost:9200,我会得到回复: 下面是我的docker