首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FTP4j无法使用FTPES (数据连接的TLS会话未恢复或会话与控制连接不匹配)

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

Stack Overflow用户
提问于 2017-11-10 16:21:08
回答 2查看 3.6K关注 0票数 2

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

代码语言:javascript
复制
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);
    }
}

我有个例外

线程“it.sauronsoftware.ftp4j.FTPException”it.sauronsoftware.ftp4j.FTPException code=450中的异常,数据连接的message= TLS会话没有恢复,或者会话与FTP.main at FTP.main(FTP.java:49)的控制连接不匹配。

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

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

请您回答我做错了什么,还是ftp4j库实际上支持FTPES & TLS?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-10 17:05:30

ftp4j库确实支持FTPS/TLS。如果没有,您就不会从一开始就得到错误。

FileZilla FTP服务器是FTP服务器之一,它要求客户端重用来自FTP控制连接的TLS/SSL会话,用于数据连接:

https://svn.filezilla-project.org/filezilla?view=revision&revision=6661

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

不过,我不知道ftp4j是否支持重用。

其他解决办法是:

  • 使用中的Java客户端。虽然它本身不支持重用,但添加支持很容易。请参阅如何使用相同的TLS会话连接数据连接到FTPS服务器?
  • 由于您拥有FTP服务器,因此可以禁用对重用的要求。使用PROT选项(在屏幕截图上)时,请参见对数据连接的要求TLS会话恢复。尽管如上所述,它对安全性有一定的影响。
票数 1
EN

Stack Overflow用户

发布于 2017-11-13 14:10:43

试着移除这个复选框它帮了我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47227095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档