将 Jsch 0.1.42 升级到 0.1.54 生成到远程服务器的连接超时

Upgrade Jsch 0.1.42 to 0.1.54 generates Connection timeout to remote server

我们正在使用 Spring Batch Admin 来处理连接到不同远程 SFTP 服务器的不同作业。我们有两个 SBA,所以我实际上已经将这项工作从旧版本移到了新版本。

Jcraft 中的所有作业都使用 JSch,我已将此版本从 0.1.42 升级到 0.1.54。除了这个最新的作业外,所有作业都运行良好,它们连接没有任何问题。

在这项工作中,我遇到连接超时,我不明白为什么。

另一个(大)问题是我无法真正从我自己的计算机本地解决这个问题,我什至无法从我的计算机通过 WinSCP 登录到这个远程 SFTP 帐户来验证它自己的连接。 SFTP 服务器的所有者说他们可以在他们的防火墙中看到我的连接,但不能超出并且不能连接到他们的 SFTP。只有在他们的 SFTP 服务器上才能看到成功的连接,所以他们看不到为什么我无法连接,因为我的连接失败了。

我在 Java 中添加了新政策,在 Java 8 和 Java 7 中。 我仍然无法 运行 我的工作。我在 Whosebug 和 Google 上进行了搜索,但没有找到任何解决方案。 我在新旧工作中都使用 Spring 框架集成 sftp Session 和 DefaultSftpSessionFactory,版本 2.0.3。我们使用 Java 7 和 Tomcat 8 并且在 Tomcat

中添加了“-Dhttps.protocols=TLSv1.1,TLSv1.2”

这是 Jsch 版本 0.1.54 的新作业连接到 SFTP 服务器时的日志

com.jcraft.jsch (log:52)  - Connecting to XX.XXX.XX.XX port 22
com.jcraft.jsch (log:52)  - Connection established
com.jcraft.jsch (log:52)  - Remote version string: SSH-2.0-1.86 FRES
com.jcraft.jsch (log:52)  - Local version string: SSH-2.0-JSCH-0.1.54
com.jcraft.jsch (log:52)  - CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
com.jcraft.jsch (log:52)  - CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
com.jcraft.jsch (log:52)  - diffie-hellman-group14-sha1 is not available.
com.jcraft.jsch (log:52)  - CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
com.jcraft.jsch (log:52)  - SSH_MSG_KEXINIT sent
com.jcraft.jsch (log:52)  - SSH_MSG_KEXINIT received
com.jcraft.jsch (log:52)  - kex: server: diffie-hellman-group14-sha256,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
com.jcraft.jsch (log:52)  - kex: server: ssh-rsa
com.jcraft.jsch (log:52)  - kex: server: aes256-cbc,aes256-ctr,3des-cbc
com.jcraft.jsch (log:52)  - kex: server: aes256-cbc,aes256-ctr,3des-cbc
com.jcraft.jsch (log:52)  - kex: server: hmac-sha2-256,hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96
com.jcraft.jsch (log:52)  - kex: server: hmac-sha2-256,hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96
com.jcraft.jsch (log:52)  - kex: server: zlib,none
com.jcraft.jsch (log:52)  - kex: server: zlib,none
com.jcraft.jsch (log:52)  - kex: server: 
com.jcraft.jsch (log:52)  - kex: server: 
com.jcraft.jsch (log:52)  - kex: client: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
com.jcraft.jsch (log:52)  - kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521
com.jcraft.jsch (log:52)  - kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-ctr,aes192-cbc,aes256-ctr,aes256-cbc
com.jcraft.jsch (log:52)  - kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc,aes192-ctr,aes192-cbc,aes256-ctr,aes256-cbc
com.jcraft.jsch (log:52)  - kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
com.jcraft.jsch (log:52)  - kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96
com.jcraft.jsch (log:52)  - kex: client: none
com.jcraft.jsch (log:52)  - kex: client: none
com.jcraft.jsch (log:52)  - kex: client: 
com.jcraft.jsch (log:52)  - kex: client: 
com.jcraft.jsch (log:52)  - kex: server->client 3des-cbc hmac-md5 none
com.jcraft.jsch (log:52)  - kex: client->server 3des-cbc hmac-md5 none
com.jcraft.jsch (log:52)  - SSH_MSG_KEX_DH_GEX_REQUEST(1024<1024<1024) sent
com.jcraft.jsch (log:52)  - expecting SSH_MSG_KEX_DH_GEX_GROUP
com.jcraft.jsch (log:52)  - Disconnecting from XX.XXX.XX.XX port 22

Jsch 版本 0.1.42 的旧版本作业连接到 SFTP 服务器时的日志

com.jcraft.jsch (log:52)  - Connecting to XX.XXX.XX.XX port 22
com.jcraft.jsch (log:52)  - Connection established
com.jcraft.jsch (log:52)  - Remote version string: SSH-2.0-1.86 FRES
com.jcraft.jsch (log:52)  - Local version string: SSH-2.0-JSCH-0.1.42
com.jcraft.jsch (log:52)  - CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
com.jcraft.jsch (log:52)  - SSH_MSG_KEXINIT sent
com.jcraft.jsch (log:52)  - SSH_MSG_KEXINIT received
com.jcraft.jsch (log:52)  - kex: server->client 3des-cbc hmac-md5 none
com.jcraft.jsch (log:52)  - kex: client->server 3des-cbc hmac-md5 none
com.jcraft.jsch (log:52)  - SSH_MSG_KEXDH_INIT sent
com.jcraft.jsch (log:52)  - expecting SSH_MSG_KEXDH_REPLY
com.jcraft.jsch (log:52)  - ssh_rsa_verify: signature true
com.jcraft.jsch (log:52)  - Host 'XX.XXX.XX.XX' is known and mathces the RSA host key
com.jcraft.jsch (log:52)  - SSH_MSG_NEWKEYS sent
com.jcraft.jsch (log:52)  - SSH_MSG_NEWKEYS received
com.jcraft.jsch (log:52)  - SSH_MSG_SERVICE_REQUEST sent
com.jcraft.jsch (log:52)  - SSH_MSG_SERVICE_ACCEPT received
com.jcraft.jsch (log:52)  - Authentications that can continue: keyboard-interactive,password
com.jcraft.jsch (log:52)  - Next authentication method: keyboard-interactive
com.jcraft.jsch (log:52)  - Authentications that can continue: password
com.jcraft.jsch (log:52)  - Next authentication method: password
com.jcraft.jsch (log:52)  - Authentication succeeded (password).
job.FtpFileFetcher (downloadFile:62)  - Listing remote directory: .
job.FtpFileFetcher (downloadFile:64)  - Found 2 entries in: ., 
job.FtpFileFetcher (filterEntries:139)  - file: file_20190218221932.xml attributes: -rw-rw-rw- 0 0 3369 Mon Feb 18 22:19:33 CET 2019
job.FtpFileFetcher (filterEntries:139)  - file: file_20190219214922.xml attributes: -rw-rw-rw- 0 0 3369 Tue Feb 19 21:49:22 CET 2019
job.FtpFileFetcher (downloadFile:66)  - Found 2 files in: ., matching pattern: file.\d{14}.xml 
job.FtpFileFetcher (downloadFile:71)  - Fetching matching file file_20190219214922.xml to local directory K:/files
job.FtpFileFetcher (executeDownload:104)  - Downloading remote file ./file_20190219214922.xml to K:\files\file_20190219214922.xml
com.jcraft.jsch (log:52)  - Disconnecting from XX.XXX.XX.XX port 22

我看到了区别,但我不明白哪里出了问题,我希望这里有人能帮助我。 如果您需要查看更多内容,请询问 谢谢

首先,https.protocols 仅适用于 HTTPS,即基于 TLS 的 HTTP。 Jsch 实现了与 HTTPS、HTTP 和 TLS 完全独立且无关的 SSH 和 SFTP。

您的系统提供 DH_GEX(组交换),最小值=1024 pref=1024 最大值=1024,因为 Java7 不支持大于 1024 位的 DH。服务器可能不喜欢这样,因为 DH 大小 1024 现在被认为是不安全的(根据 NIST,自 2014 年以来,其他有所不同)。如果你可以 移动到 Java8 (或更高)它应该解决这个问题,或者如果你有 OpenJDK 或付费支持 OracleJDK 7u171 也根据发行说明(我没有已测试)。

您的客户端没有提供 group14,即使它已配置,大概是出于同样的原因;请参阅行 diffie-hellman-group14-sha1 is not available. 然而,服务器 确实 提供 group1,即使它只有 1024 位,也许是为了向后兼容;如果你不能像上面那样修复你的 Java,请尝试配置 Kex 以排除(两个)group-exchange 并离开 group1:

session.setConfig(conf);
// with a Properties that includes
conf.put("kex","ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1");
// or if you prefer just 
conf.put("kex","diffie-hellman-group1-sha1");
// since server doesn't agree to any ecdh anyway