2016-06-06 7 views
2

Привет, я пытаюсь простую sftp, но я получаю сообщение об ошибке при создании. подключение, я использую maverick-legacy-client-all jar доступен по адресу https://www.sshtools.com/en/products/java-ssh-client Этот код работал нормально с выпуском 1.6.9, но он не удался, когда я обновил его до 1.6.17.java.security.InvalidAlgorithmParameterException, входящий в SFTP

Я также попытался идти через там банку changes doc here, там было несколько замечаний относительно моего исключения DiffieHellmanGroupExchange Algo изменения, связанного, но я не в состоянии понять их ясно.

public void connect() throws SshException, IOException, 
     SftpStatusException, ChannelOpenException { 

    SshConnector con = SshConnector.createInstance(); 
    con.setKnownHosts(new SftpHostKeyVerification()); 
    // Tries SSH2 first and fallback to SSH1 if its not available 
    con.setSupportedVersions(SshConnector.SSH1 | SshConnector.SSH2); 
    /*Error coming here, in con.connect*/ 

    this.ssh = con 
      .connect(new SocketTransport(this.host, DEFAULT_SSH_PORT), 
        this.userName); 

    PasswordAuthentication pwd = new PasswordAuthentication(); 
    pwd.setPassword(this.passwod); 
    int isLoggedIn = this.ssh.authenticate(pwd); 
    if (SshAuthentication.COMPLETE == isLoggedIn) { 
     this.client = new SftpClient(this.ssh); 
    } else { 
     throw new IOException("[Authentication failure] login status: " 
       + isLoggedIn); 
    } 
} 

Исключение Log:

com.maverick.ssh.SshException: com.maverick.ssh.SshException 
    at com.maverick.ssh.components.jce.client.DiffieHellmanGroupExchangeSha1.performClientExchange(DiffieHellmanGroupExchangeSha1.java:315) 
    at com.maverick.ssh2.TransportProtocol.performKeyExchange(TransportProtocol.java:1424) 
    at com.maverick.ssh2.TransportProtocol.processMessage(TransportProtocol.java:1835) 
    at com.maverick.ssh2.TransportProtocol.startTransportProtocol(TransportProtocol.java:348) 
    at com.maverick.ssh2.Ssh2Client.connect(Ssh2Client.java:146) 
    at com.maverick.ssh.SshConnector.connect(SshConnector.java:649) 
    at com.maverick.ssh.SshConnector.connect(SshConnector.java:471) 
    at com.tekelec.ems.util.SftpImpl.connect(SftpImpl.java:73) 
    at com.tekelec.ems.eagle.measurement.WriterThread.run(WriterThread.java:93) 

Caused by: com.maverick.ssh.SshException: Failed to generate DH value: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive) [java.security.InvalidAlgorithmParameterException] 
    at com.maverick.ssh.components.jce.client.DiffieHellmanGroupExchangeSha1.performClientExchange(DiffieHellmanGroupExchangeSha1.java:250) 
    ... 8 more 

Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive) 
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120) 
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:658) 
    at java.security.KeyPairGenerator.initialize(KeyPairGenerator.java:400) 
    at com.maverick.ssh.components.jce.client.DiffieHellmanGroupExchangeSha1.performClientExchange(DiffieHellmanGroupExchangeSha1.java:240) 
    ... 8 more 

ответ

1

Это потому, что алгоритм обмена ключа по умолчанию был изменен на более безопасный алгоритм между этими версиями и вы не включили все зависимости 3 участника, которые предоставляются в lib из дистрибутива Maverick Legacy Client. Эта папка содержит поставщик BouncyCastle JCE, который, если добавить к пути класса, разрешит эту проблему.

Проблема, с которой вы сталкиваетесь, заключается в том, что без провайдера BouncyCastle JCE или подходящего поставщика JCE, который поддерживает большие простые числа Диффи Хелмана, вы не сможете генерировать большое простое значение для обновленного, более безопасного метода обмена ключами.

+0

Как вы упомянули, эта папка содержит поставщик BouncyCastle JCE, который, если добавлен в путь класса, разрешит эту проблему, пожалуйста, назовите меня, какие все остальные банки нужно добавить из этого пакета. – yug

0

Я считаю, что это очень серьезное условие для многих кодеров, Также я хотел бы поблагодарить Lee David здесь за советом здесь. я смог справиться с этой ситуацией , добавив Bouncy Castle JCE 3rd party jar, доступный в папке maverick lib.

Перед этим я пытался изменить файл java.security, как это было предложено в другом посте, но это было очень просто, также эти баны Bouncy Castle поставляются в официальном выпуске Maverick, поэтому не стоит беспокоиться об этой части.