使用Commons Net FTPSClient

时间:2017-05-22 17:51:48

标签: java ssl ftp apache-commons-net

我的代码(我在运行时使用-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:远程主机关闭连接   在握手期间         at 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:否(否); FnCs:N; RIC:0100;   简历:S(102400); CalcS:是的;面具: 536 TM:B; ClAr:不;   RemEOF:不; RemBOM:不; CPS:0; NewerOnly:不; InclM :;简历L:0 536   AscM:*。* html;的* .htm; *。文本; * .PHP; * .php3; * cgi的; *。C; *的.cpp; *。H;   * .PAS; * .BAS; * .tex; *特等; * .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 Iniciando   carregamento de C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql   560 TYPE I 562 200类型设置为I 563 PASV 568 227输入被动   模式(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 bit   RSA,ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx = ECDH Au = RSA   Enc = AESGCM(256)Mac = AEAD580ConexãoSSLEstabelecida 586 226   成功转让“/cliente-dados.sql”586 MFMT 20161006163429   cliente-dados.sql 590 213 modify = 20161006163429; /cliente-dados.sql   590 Carregamento bem-sucedido 591完成转移:   'C:\ Users \ trescon.jramos \ Documents \ cliente-dados.sql'[4869]

1 个答案:

答案 0 :(得分:0)

您正在连接到端口990,什么是隐式FTPS端口。但是,您正在将false传递给FTPSClient constructorisImplicit个参数。

如果您真的想使用隐式FTPS,请传递true

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

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

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

换句话说,您需要使用FTPS只需使用FTPSClient,不需要额外的参数或调用。