FTP登录错误的HTTPS客户端:javax.net.ssl.SSLException:502 SSLv23/TLSv1 java

FTP登录错误的HTTPS客户端:javax.net.ssl.SSLException:502 SSLv23/TLSv1 java,java,ssl,ftp,apache-commons,tumbleweed,Java,Ssl,Ftp,Apache Commons,Tumbleweed,我对Java非常陌生,所以你解释的越多,我学到的越多,问的问题也就越少;我正试图编程一个客户端连接到ftp.availability.com,但我一生都无法让客户端登录。我尝试更改端口号443、20等,但它们都不会在控制台日志中返回响应,它只返回超时错误。我唯一可以使用的是端口21。我知道这是FTP,我认为这可能是错误的来源,但我不知道如何纠正它,因为显然更改端口并不能纠正问题。任何帮助都将不胜感激 这是我的密码: import java.io.IOException; import org.a

我对Java非常陌生,所以你解释的越多,我学到的越多,问的问题也就越少;我正试图编程一个客户端连接到ftp.availability.com,但我一生都无法让客户端登录。我尝试更改端口号443、20等,但它们都不会在控制台日志中返回响应,它只返回超时错误。我唯一可以使用的是端口21。我知道这是FTP,我认为这可能是错误的来源,但我不知道如何纠正它,因为显然更改端口并不能纠正问题。任何帮助都将不胜感激

这是我的密码:

import java.io.IOException;
import org.apache.commons.net.ftp.*;

public class FTPApp {
private static void showServerReply(FTPSClient ftpClient) {
    String[] replies = ftpClient.getReplyStrings();
    if (replies != null && replies.length > 0) {
        for (String aReply : replies) {
            System.out.println("SERVER: " + aReply);
        }
    }
}

public static void main(String[] args) {

    String server = "ftp.availity.com";
    int port = 21;
    String user = "user";
    String pass = "pass";
    FTPSClient ftpClient = new FTPSClient();

    try {
        ftpClient.connect( server, port);   
        showServerReply(ftpClient);
        int replyCode = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(replyCode)) {
            System.out.println("Operation failed. Server reply code: " + replyCode);
            return;
        }
        boolean success = ftpClient.login(user, pass);
        showServerReply(ftpClient);
        if (!success) {
            System.out.println("Could not login to the server");
            return;
        } else {
            System.out.println("LOGGED IN SERVER");
        }
    } catch (IOException ex) {
        System.out.println("Oops! Something wrong happened");
        ex.printStackTrace();
    }
}
}

以下是错误:

Oops! Something wrong happened
javax.net.ssl.SSLException: 502 SSLv23/TLSv1
at org.apache.commons.net.ftp.FTPSClient.execAUTH(FTPSClient.java:242)
at org.apache.commons.net.ftp.FTPSClient._connectAction_(FTPSClient.java:225)
at org.apache.commons.net.SocketClient._connect(SocketClient.java:244)
at org.apache.commons.net.SocketClient.connect(SocketClient.java:202)
at FTPApp.main(FTPApp.java:23)

正在此处添加我的评论,因为我最近没有足够的声誉:。 从错误来看,似乎是SSL/TLS协商存在问题,导致返回502代码。您可以添加-Djavax.net.debug=all作为jvm属性来调试有关确切SSL协商问题的更多信息

我尝试更改端口号443、20等,但它们都不会在控制台日志中返回响应,它只返回超时错误。我唯一可以使用的是端口21

这一点也不奇怪:端口443是HTTPS,它与FTP完全无关。端口20是用作FTP数据连接源的数据端口,但不是需要连接的端口。端口21是FTP控制端口,即实际需要连接的端口

哎呀!出事了 javax.net.ssl.SSLException:502 SSLv23/TLSv1 位于org.apache.commons.net.ftp.FTPSClient.execAUTHFTPSClient.java:242

此处使用的命令是AUTH TLS,客户端使用该命令将端口21上的普通FTP连接升级为FTPS,即通过TLS的FTP。将普通SMTP连接升级为通过TLS的SMTP与STARTTLS类似

AUTH TLS期望从服务器获得成功的响应代码。取而代之的是代码502,它代表未实现的命令。这仅仅意味着与您交谈的FTP服务器不支持通过TLS的FTP,您无法从客户端强制执行此操作

如果您可以控制服务器,则需要为TLS支持配置服务器。如果您无法控制服务器,您可以使用无保护的普通FTP,即不是FTPSClient而是FTPClient,也可以放弃

我对Java还很陌生

所有这些都不需要任何Java知识。它只需要知道FTP和FTPS是如何工作的。

我知道了

ftp.availity.com是我登录时要访问的url,但在为主机输入该url时,为了确保安全,我所要做的就是保留FTPSClient,但使主机ftps.availity.com不仅仅是ftp.availity.com

ftp服务器是在Axway SecureTransport或Tumbleweed下设置的,因此希望有相同问题的任何人都能找到此线程


非常感谢你们帮助我

奇怪的错误。您通过SSL收到FTP错误502,这意味着“未实现命令”,这意味着SSL部分工作正常,这意味着它根本不是SSLException。这里没有。除非TLS协商工作正常,否则服务器无法返回502。否则,就没有传输它的通道。对于Apache来说,这是一个糟糕的例外选择。请注意,该错误是由AuthenitAction方法引发的,而不是TLS方法。如果使用普通FTP FTPClient,则会显示错误消息server:220 10.71.64.18 FTP server 5.3.6 ready。服务器:530 SSL是必需的。无法登录到服务器,我想它可能需要通过SSL而不是TLS连接,但我找不到有关如何实现这一点的任何信息。