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

Posted

技术标签:

【中文标题】带有 FTP 登录错误的 HTTPS 客户端:javax.net.ssl.SSLException: 502 SSLv23/TLSv1 java【英文标题】:HTTPS Client with FTP Login Error: javax.net.ssl.SSLException: 502 SSLv23/TLSv1 java 【发布时间】:2018-06-15 03:08:39 【问题描述】:

我对 Java 很陌生,所以你解释得越多,我学到的东西就越多,我会问的问题就越少;) 我正在尝试编写一个客户端来连接到 ftp.availity.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)

【问题讨论】:

奇怪的错误。您收到 FTP 错误 502,这意味着“命令未实现”,通过 SSL,这意味着 SSL 部分工作正常,这意味着它根本不是 SSLException。这里没有https。 【参考方案1】:

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

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

哎呀!发生了错误 javax.net.ssl.SSLException: 502 SSLv23/TLSv1 在 org.apache.commons.net.ftp.FTPSClient.execAUTH(FTPSClient.java:242)

这里使用的命令是AUTH TLS,客户端使用它来将普通的 FTP 连接(根据端口 21 的要求)升级到 FTPS,即 FTP over TLS。类似于 STARTTLS 将普通 SMTP 连接升级为 SMTP over TLS。

AUTH TLS 期望来自服务器的成功响应代码。相反,它得到代码 502,代表“命令未实现”。这仅仅意味着您与之交谈的 FTP 服务器不支持 FTP over TLS,并且您无法从客户端执行任何操作来强制执行此操作。

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

我对 Java 还是很陌生 ...

这些都不需要任何 Java 知识。它只需要了解 FTP 和 FTPS 的工作原理。

【讨论】:

如果我使用普通 FTP (FTPClient),它会给我错误消息“ERVER: 220 10.71.64.18 FTP server 5.3.6 ready. SERVER: 530 SSL is required. could not login to the server”我认为它可能需要通过 SSL 而不是 TLS 进行连接,但我找不到任何关于如何实现这一点的信息。【参考方案2】:

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

【讨论】:

除非 TLS 协商完美运行,否则服务器无法返回 502。否则没有通道可以传输它。就 Apache 而言,这是一个糟糕的例外选择。请注意,错误是由身份验证方法引发的,而不是 TLS 方法。【参考方案3】:

我想通了!

ftp.availity.com 是我要登录的 url,但是当把它放入主机时,为了确保安全,我所要做的就是保留“FTPSClient”,但让主机“ftps.availity.com”不仅仅是“ftp.availity.com”。

ftp 服务器是在 Axway SecureTransport 或 Tumbleweed 下设置的,所以希望任何有同样问题的人都能找到这个帖子!!!

非常感谢大家对我的帮助!

【讨论】:

以上是关于带有 FTP 登录错误的 HTTPS 客户端:javax.net.ssl.SSLException: 502 SSLv23/TLSv1 java的主要内容,如果未能解决你的问题,请参考以下文章

抓包来看ftp状态码

Ftp 错误代码 550,如何解决

FTP 错误 530 用户无法登录

vsftpd常见的错误代码

KYSL laoyuan 发来交叉编译后的ftp仓库 源码分析 在arm摄像头下用法分析(数据服务器ip登录用户及密码)ftp(netkit-ftp)客户端的搭建(arm移植ftp)

ftp命令详解