【问题标题】:"Remote host closed connection during handshake" when connecting to FTP server using Commons Net FTPSClient使用 Commons Net FTPSClient 连接到 FTP 服务器时出现“握手期间远程主机关闭连接”
【发布时间】:2017-10-22 11:34:43
【问题描述】:

我的代码(我在运行时使用-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:没有;右:rw-r--r--; PrR:否(否); FnCs:N; RIC:0100; 简历:S(102400);计算:是的;面具:. 536 TM:B; ClAr:没有; RemEOF:没有; RemBOM:没有; CPS:0;仅更新:否;包括:;简历L:0 536 AscM: *.*html; *.htm; *。文本文件; *.php; *.php3; *.cgi; *。C; *.cpp; *。H; *.pas; *.bas; *.tex; *.pl; *.js; .htaccess; *.xml; *.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 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 位 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 客户端-dados.sql 590 213 修改=20161006163429; /cliente-dados.sql 590 Carregamento bem-succedido 591 转移完成: 'C:\Users\trescon.jramos\Documents\cliente-dados.sql' [4869]

【问题讨论】:

    标签: java ssl ftp apache-commons-net


    【解决方案1】:

    您正在连接到端口 990,这是一个隐式 FTPS 端口。然而,您将false 传递给isImplicitFTPSClient constructor 参数。

    如果你真的想使用隐式 FTPS,要么通过true

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 2017-03-03
      • 2012-08-12
      • 2018-09-27
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多