我的代码(运行时使用-Dhttps.protocols=TLSv1.2 VM参数):

FTPSClient ftpClient = new FTPSClient("TLS", false);
ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
ftpClient.setAuthValue("TLS");

ftpClient.connect("myhost", 990);
ftpClient.login("mylogin", "mypassword");


堆栈跟踪:


  javax.net.ssl.SSLHandshakeException:远程主机关闭连接
  握手期间
        在sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:992)
      //痕迹太多...
      引起原因:java.io.EOFException:SSL对等项错误关闭
        在sun.security.ssl.InputRecord.read(InputRecord.java:505)
        在sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
        ...更多33


从WinSCP记录日志(我可以使用WinSCP发送文件):


  536将1个文件/目录复制到远程目录“ /” 536 PrTime:
  是; PrRO:否; Rght:rw-r--r--; PrR:否(否); FnC:N; RIC:0100;
  简历:S(102400); CalcS:是的;遮罩:。 536 TM:B;克莱尔:不;
  RemEOF:否; RemBOM:否; CPS:0;仅适用于: InclM :;简历:0536
  AscM:*。* html; * .htm; *。文本文件; * .php; * .php3; * .cgi; *。C; * .cpp; *。H;
  * .pas; * .bas; * .tex; * .pl; * .js; .htaccess; * .xtml; * .css; * .cfg; * .ini; * .sh; * .xml 539文件:'C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql'
  [2016-10-06T16:34:29.298Z] [4869] 557正在复制
  “ C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql”到远程
  目录已启动。 560选择了二进制传输模式。 560伊尼西亚多
  carregamento de C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql
  560 TYPE I 562200 Type设置为I 563 PASV 568227输入被动
  模式(10,28,14,218,250,0)569 STOR cliente-dados.sql 569 Conectando a
  10.28.14.218:64000 ... 575 150打开文件上传到“ /cliente-dados.sql”服务器的数据通道579重用会话ID 579使用
  TLSv1.2,密码TLSv1 / SSLv3:ECDHE-RSA-AES256-GCM-SHA384,2048位
  RSA,ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx = ECDH Au = RSA
  Enc = AESGCM(256)Mac = AEAD 580ConexãoSSL estabelecida 586226
  已成功转移“ /cliente-dados.sql”586 MFMT 20161006163429
  cliente-dados.sql 590213 Modify = 20161006163429; /cliente-dados.sql
  590 Carregamento bem-sucedido 591完成转让:
  'C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql'[4869]

最佳答案

您正在连接到端口990,这是隐式FTPS端口。但是,您正在将false传递给isImplicit constructorFTPSClient参数。

如果确实要使用隐式FTPS,请通过true

FTPSClient ftpClient = new FTPSClient("TLS", true);


或者实际上,您应该真正使用显式FTPS和默认FTP端口21(因为隐式FTPS是非标准的旧版兼容性黑客):

FTPSClient ftpClient = new FTPSClient();
// ...
ftpClient.connect("myhost");


换句话说,使用FTPS所需要的只是使用FTPSClient,不需要其他参数或调用。

10-07 13:01