使用Commons Net FTPSClient连接到FTP服务器时"Remote host closed connection during handshake"



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

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 peer app在sun.security.ssl.InputRecord.read(
InputRecord.java:505)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)...
33 更多

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

536 将 1 个文件/目录复制到远程目录 "/" 536 PrTime: 是的;PrRO:没有;rght: rw-r--r--;公关:否(否);FnCs: N;RIC: 0100; 简历: S (102400);计算:是的;掩码:536 TM:B;克拉尔:没有; RemEOF:没有;雷姆博姆:没有;CPS: 0;仅较新:否;包括: ;简历L: 0 536 AscM: *.*html;*。.htm;*。.txt;*。.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" to remote 目录已启动。560 已选择二进制传输模式。560 伊尼奇安多 carregamento de C:\Users\trescon.jramos\Documents\cliente-dados.sql 560 类型 I 562 200 类型设置为 I 563 PASV 568 227 进入被动 模式 (10,28,14,218,250,0) 569 STOR 客户端.sql 569 Conectando a 10.28.14.218:64000... 575 150 打开文件上传到"/cliente-dados.sql服务器的数据通道 579 会话 ID 重复使用 579 使用 TLSv1.2, cipher 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=AEAD 580 Conexão SSL estabelecida 586 226 成功转移 "/cliente-dados.sql" 586 MFMT 20161006163429 cliente-dados.sql 590 213 修改=20161006163429;/cliente-dados.sql 590 Carregamento bem-sucedido 591 转移完成: 'C:\Users\trescon.jramos\Documents\cliente-dados.sql' [4869]

您正在连接到端口 990,什么是隐式 FTPS 端口。然而,您正在false传递给isImplicit构造函数FTPSClient参数。

要么传递true,如果你真的想使用隐式的FTPS:

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

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

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

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

相关内容

最新更新