2017-07-25 183 views
1

我想连接到使用SFTP的密码较少配置的服务器。 使用终端,Sftp连接成功。 但是,当我通过用户名和密码连接到JAVA(使用Jsch库)时,我无法连接。 我的Java代码: -SFTP连接失败,由于java.security.InvalidAlgorithmParameterException

try { 
     try { 
      jsch.addIdentity(ftp_Info.getSftpCertFile()); 
     } catch (Exception e) { 
      // TODO: Add a log message 
     } 
     session = jsch.getSession(ftp_Info.getUserName(), ftp_Info.getHost(), ftp_Info.getPort()); 
     String pswd = (password_encypted) // password encryption 
     session.setPassword(pswd); 
     session.setConfig("StrictHostKeyChecking", "no"); 
     session.setConfig("PreferredAuthentications", "password,hostbased,publickey"); 
     session.connect(); // exception occurred here 
     session.setTimeout(connectionTimeOut); 
     Channel channel = session.openChannel(SFTP); 
     channel.connect(); 
     sftpChannel = (ChannelSftp) channel; 

    } catch (Exception e) { 
     log.error(e.getMessage(), e);//error logged here 
    } 

我得到以下异常: -

com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive) at com.jcraft.jsch.Session.connect(Session.java:485) at com.jcraft.jsch.Session.connect(Session.java:149)

请在故障排除或解决它帮助。 除了任何第三方服务提供商使我的2048位密钥传递此异常之外,有什么方法吗?

+0

我怀疑这是你的加密套件的问题。您可能要切换到使用BouncyCastle提供程序。你在用什么JDK? –

+0

我正在使用jdk 1.7 –

回答

0

1.7以下,我会假设你正在为你的项目使用maven。我会添加bouncycastle依赖到你的pom。

<dependency> 
    <groupId>org.bouncycastle</groupId> 
    <artifactId>bcprov-jdk16</artifactId> 
    <version>1.45</version> 
</dependency> 

这应该很好地工作JDK 7

然后添加一行代码到BouncyCastle的供应商添加为第一供应商。

Security.insertProviderAt(new BouncyCastleProvider(),1); 

我会在你的getSftpCertFile()调用之前和任何与SSL相关的代码之前放置它。如果您没有使用Maven或有不同的基础架构,请告诉我。您可以在JRE级别配置安全提供程序,但如果可能的话,我总是希望在项目级别进行配置,以不影响其他项目。

+0

我的密钥大小是2048位,我认为这就是我得到异常的原因。请问jdk1.8会使它工作还是bountyCastleProvider。如果jdk1.8会比这更可行。 –

+0

JCE对Diffie-Hellman素数(JDK-651495)施加了人为限制的问题本应在JDK8u56中解决。所以只要你使用JDK8u56或更高版本,这应该解决这个问题。 –

+0

感谢您的帮助@ M.Rizzo –