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

FTP客户端收到网络错误javax.net.ssl.SSLHandshakeExc0019:远程主机在握手过程中关闭连接

樊俊悟
2023-03-14

我正在尝试连接到需要“通过TLS显式FTP”的FTP并上载文件。

我正在尝试从我的本地机器上实现它,它使用Java版本8和commons net FTP版本3.6

下面是我使用的代码

          try {

              FTPSClient ftpClient = new FTPSClient();


              ftpClient.setDataTimeout(300); 
              ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
              ftpClient.setAuthValue("TLS");
              ftpClient.connect(server, port);
              int reply = ftpClient.getReplyCode();


              if (FTPReply.isPositiveCompletion(reply)) {
                  ftpClient.execAUTH("TLS"); //SSL


                // Login
                if (ftpClient.login(user, pass)) {

                  // Set protection buffer size
                  ftpClient.execPBSZ(0);
                  // Set data channel protection to private
                  ftpClient.execPROT("P");
                  // Enter local passive mode
                  ftpClient.enterLocalPassiveMode();
                  ftpClient.changeWorkingDirectory("/");
                  ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
              File firstLocalFile = new File(outputFileNameCSV);
                              String firstRemoteFile = csvFileNameOut;
                  InputStream inputStream = new FileInputStream(firstLocalFile);

                  // Store file on host
                  boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
              inputStream.close();
              if (done) 
              {
                System.out.println("The file is uploaded successfully.");
              }

              // Logout
              ftpClient.logout();

                } else {
                  System.out.println("FTP login failed");
                }

                // Disconnect
                ftpClient.disconnect();

              } else {
                System.out.println("FTP connect to host failed");
              }
            } catch (IOException ioe) {
              System.out.println("FTP client received network error "+ioe);
            }

下面是我从Java CommandListener获得的日志

220-FileZilla Server 0.9.60 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/
AUTH TLS
234 Using authentication type TLS
AUTH TLS
534 Authentication type already set to TLS
FTP login screen
USER test
331 Password required for test
PASS pass
230 Logged on
PBSZ 0
200 PBSZ=0
PROT P
200 Protection level set to P
CWD /
250 CWD successful. "/" is current directory.
TYPE I
200 Type set to I
PASV
227 Entering Passive Mode ()
STOR file.csv
150 Opening data channel for file upload to server of "/file.csv"
FTP client received network error javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

下面是我尝试使用FileZilla连接时的日志。连接很好,我可以传送文件。

但是,当我尝试使用Java时,它不会传输数据

Response:   220-FileZilla Server 0.9.60 beta
Response:   220-written by Tim Kosse (tim.kosse@filezilla-project.org)
Response:   220 Please visit https://filezilla-project.org/
Command:    AUTH TLS
Response:   234 Using authentication type TLS
Status: Initializing TLS...
Status: Verifying certificate...
Command:    USER test
Status: TLS/SSL connection established.
Response:   331 Password required for test
Command:    PASS pass
Response:   230 Logged on
Command:    PBSZ 0
Response:   200 PBSZ=0
Command:    PROT P
Response:   200 Protection level set to P
Status: Connected
Status: Starting upload of file.csv
Command:    CWD /
Response:   250 CWD successful. "/" is current directory.
Command:    TYPE I
Response:   200 Type set to I
Command:    PASV
Response:   227 Entering Passive Mode ()
Command:    STOR file.csv
Response:   150 Opening data channel for file upload to server of "/file.csv"
Response:   226 Successfully transferred "/file.csv"
Status: File transfer successful, transferred 12,252 bytes in 1 second

请大家帮忙好吗?

亲切的问候乔恩

共有1个答案

乜华翰
2023-03-14

现代FTP服务器期望通过使用TLS会话恢复来打开数据通道。Java能够做到这一点,但只能用于连接到相同的IP和端口。由于FTP会话的数据通道使用不同的端口,因此该机制会失败,因此您需要强制JVM这样做,并包括使用反射对java类的实习生进行大量的修改。

您使用的是ApacheFTPSClient,因此您可能会检查它的最新版本是否已经为您提供了该功能,但如果仍然没有提供,您可以按照Wealthfront博客文章中的描述自行完成。

黑客(我仍然无法用不同的方式称呼它)在客户端工作得很好,但是如果您想在服务器端执行此操作(即,如果您想实现自己的FTP服务器),则还有一些重要的额外工作要做。你的问题看起来不像,所以我在这个答案中省略了这一部分。

 类似资料:
  • 我试图连接到需要显式FTP在TLS的FTP。我正试图从我的本地机器上做这件事。 下面是我使用的代码 当我跑的时候,我得到下面的异常 下面是我从Java CommandListener获得的日志 下面是我尝试使用FileZilla连接时的日志。它连接良好,我可以传输文件。但是当我尝试使用Java时,它没有连接 你们能帮忙吗? 亲切的问候乔恩

  • 感谢您抽出时间阅读我的问题-我正在使用EclipseIDE。我希望Jsoup连接https url-https://www.icegate.gov.in/使用 但它在线程“main”javax中给出了错误,而当我对其他https(如linkedin)使用相同的代码时,它就工作了。。。我不知道如何解决这个问题。 我获得了该网站的证书,并安装在我的jre/lib/security文件夹中,但它对我也没

  • 我们为特定的IP地址配置了一个大型F5负载平衡器虚拟服务器,它将传入的https请求重定向到多个Windows服务器,在这些服务器上可以生成响应。 我正在使用SoapUI测试通过大F5中虚拟服务器的IP地址对这些windows服务器的访问。 使用由组织生成的服务器和客户机证书,我们在该组织中也进行了此设置,并通过SoapUI发送请求,我得到了预期的响应。 业务要求要求由Thawte签署商业证书。

  • SSLHandShakeException:尝试发布到以下URL时,在握手过程中发生远程主机关闭连接异常: https://testapi.title365.com/keystoneB2b/ordersservice.aspx 谁能帮帮忙吗?

  • 我正在尝试连接到SOAPendpoint。 使用上面的方法,我不断得到下面的错误 java.lang.Thread.run(未知来源)[na: 1.8。0_191]原因:com.sun.xml.messaging.saaj.SOAPExceptionImpl:消息发送失败com.sun.xml.messaging.saaj.client.p2p。HttpSOAPConnection.post(Ht

  • 我得到javax.net.ssl.SSLHandshakeExc0019:远程主机在握手异常关闭连接,当我尝试做一个Web服务的Https获取 我的HTTP连接器配置: 无论如何,我可以对我的代码做些什么来解决这个问题吗?以下是完整的错误: