【问题标题】:Not able to connect to sftp : com.jcraft.jsch.JSchException: Algorithm negotiation fail无法连接到 sftp:com.jcraft.jsch.JSchException:算法协商失败
【发布时间】:2018-05-29 10:55:13
【问题描述】:

为了获得更好的安全性,Out FTP 服务器进行了迁移(不太了解它的详细信息)。

但升级后,我们无法从服务器下载/上传文件。在升级之前它工作正常。错误日志说:

ns0:ClientCould not connect to FTP Server.http://schemas.cordys.com/ftpconnector/1.1Cordys.FTPConnector.Messages.ftpserverConnectionFailedcom.eibus.applicationconnector.ftp.FTPException: 算法协商失败

在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connect(CordysSFTPClient.java:78) 在 com.eibus.applicationconnector.ftp.FTPCommand.connect(FTPCommand.java:86) 在 com.eibus.applicationconnector.ftp.FTPTransaction.process(FTPTransaction.java:109) 在 com.eibus.soap.SOAPTransaction.handleBodyBlock(SOAPTransaction.java:1340) 在 com.eibus.soap.SOAPTransaction.(SOAPTransaction.java:546) 在 com.eibus.soap.SOAPTransaction.(SOAPTransaction.java:195) 在 com.eibus.soap.Processor.onReceive(Processor.java:1024) 在 com.eibus.soap.Processor.onReceive(Processor.java:997) 在 com.eibus.connector.nom.Connector.onReceive(Connector.java:483) 在 com.eibus.transport.NonTransactionalWorkerThreadBody.doWork(NonTransactionalWorkerThreadBody.java:61) 在 com.eibus.transport.NonTransactionalWorkerThreadBody.run(NonTransactionalWorkerThreadBody.java:26) 在 com.eibus.util.threadpool.WorkerThread.run(WorkerThread.java:67) 引起:com.jcraft.jsch.JSchException:算法协商失败 在 com.jcraft.jsch.Session.receive_kexinit(Session.java:520) 在 com.jcraft.jsch.Session.connect(Session.java:286) 在 com.jcraft.jsch.Session.connect(Session.java:150) 在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connectOnce(CordysSFTPClient.java:124) 在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connect(CordysSFTPClient.java:64) ... 11 更多

使用的jsch jar版本是:jsch-0.1.41.jar 使用的java版本是:1.7.0_40

注意

  1. 我们不拥有 FTP 服务器,因此无法更改其中的任何设置。
  2. 不能升级 Java 版本

试用 1 在谷歌上花了一些时间后,我了解到升级 jsch jar 版本可能会有所帮助。所以我使用了最新的jsch jar,即:jsch-0.1.54.jar。在此之后我开始收到以下错误:

com.eibus.applicationconnector.ftp.FTPException: Session.connect: java.security.InvalidAlgorithmParameterException: Prime size 必须是 64 的倍数,并且只能从 512 到 1024(含) 在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connect(CordysSFTPClient.java:78) 在 com.eibus.applicationconnector.ftp.FTPCommand.connect(FTPCommand.java:86) 在 com.eibus.applicationconnector.ftp.FTPTransaction.process(FTPTransaction.java:109) 在 com.eibus.soap.SOAPTransaction.handleBodyBlock(SOAPTransaction.java:1340) 在 com.eibus.soap.SOAPTransaction.(SOAPTransaction.java:546) 在 com.eibus.soap.SOAPTransaction.(SOAPTransaction.java:195) 在 com.eibus.soap.Processor.onReceive(Processor.java:1024) 在 com.eibus.soap.Processor.onReceive(Processor.java:997) 在 com.eibus.connector.nom.Connector.onReceive(Connector.java:483) 在 com.eibus.transport.NonTransactionalWorkerThreadBody.doWork(NonTransactionalWorkerThreadBody.java:61) 在 com.eibus.transport.NonTransactionalWorkerThreadBody.run(NonTransactionalWorkerThreadBody.java:26) 在 com.eibus.util.threadpool.WorkerThread.run(WorkerThread.java:67) 引起:com.jcraft.jsch.JSchException:Session.connect:java.security.InvalidAlgorithmParameterException:素数大小必须是64的倍数,并且只能在512到1024(含)之间 在 com.jcraft.jsch.Session.connect(Session.java:565) 在 com.jcraft.jsch.Session.connect(Session.java:183) 在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connectOnce(CordysSFTPClient.java:124) 在 com.eibus.applicationconnector.ftp.CordysSFTPClient.connect(CordysSFTPClient.java:64) ... 11 更多

试用 2:安装了无限强度管辖策略文件 (www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html),这也是不行的采用。遇到同样的错误

任何指针都会有所帮助。

这是我用来连接 ftp 的一段代码:

private void connectOnce(FTPConfiguration ftpConfiguration) throws JSchException {
    JSch jsch = new JSch();
    this.session = jsch.getSession(ftpConfiguration.getUsername(), ftpConfiguration.getServer(), ftpConfiguration.getPort());
    this.session.setPassword(ftpConfiguration.getPassword());

    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    this.session.setConfig(config);

    if (logger.isDebugEnabled()) {
      logger.debug("Opening SFTP connection to " + ftpConfiguration.getServer());
    }
    this.session.connect();
}

【问题讨论】:

  • 您可以将客户端版本设置为session.setClientVersion("SSH-2.0-OpenSSH_2.5.3")吗?上次,这帮助我解决了问题。
  • 当您解决了“算法协商失败”(实际上是一个重复的问题)时,请删除该部分,因为它只会混淆问题。并相应地更新问题标题! + 发布JSch log file.
  • 我想我也可以用旧的 jsch jar 找到一些解决方案,这就是主题的原因。在审判期间,我只想提供有关我的调查的更多信息。
  • @Apolozeus:试过了,没用。同样的问题

标签: java ftp jsch


【解决方案1】:

我想我找到了解决办法。

解决方案涉及修改 jsch 源代码。 (最新版本 1.0.54)。我做了一些研究,终于能够强制 jsch 使用“Bouncy Castle”安全提供程序。这涉及更改 jsch 库中以下类的源代码:

  • com.jcraft.jsch.jce.KeyPairGenDSA
  • com.jcraft.jsch.jce.KeyPairGenECDSA
  • com.jcraft.jsch.jce.KeyPairGenRSA
  • com.jcraft.jsch.jce.DH

每当它尝试生成 keyGenerator 的 geInstance 时,我都添加了以下参数。

KeyPairGenerator.getInstance("DSA","BC"); 

从这篇文章中得到了一些想法 (I've put security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider but it isn't being used during SSL handshake)

【讨论】:

猜你喜欢
  • 2018-04-14
  • 2017-02-12
  • 2015-04-21
  • 1970-01-01
  • 2015-08-14
相关资源
最近更新 更多