2014-12-18 13 views
8

Próbuję użyć JSCH, aby przesłać plik do zdalnego udziału SFTP. Za każdym razem staram się połączyć z udziałem od wewnątrz mojego kodu, otrzymuję wyjątek, który wygląda mniej więcej tak:Java 1.7 + JSCH: java.security.InvalidKeyException: Klucz jest za długi dla tego algorytmu

com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidKeyException: Key is too long for this algorithm 
    at com.jcraft.jsch.Session.connect(Session.java:558) ~[jsch-0.1.51.jar:na] 
    at com.jcraft.jsch.Session.connect(Session.java:183) ~[jsch-0.1.51.jar:na] 

widziałem posts that describe this error podczas uaktualniania do Javy 8, ale nadal jesteśmy na Java 7 i nie wiem wystarczająco dużo o obsłudze kryptografii Java, aby wiedzieć, czy to ma znaczenie.

Niektórzy sugerują zainstalowanie JCE (Java Cryptography Extensions), aby rozwiązać ten problem, więc dałem mu szansę, ale nadal mam ten sam błąd po skopiowaniu odpowiednich plików JAR do katalogu/libs/security i ponownym uruchomieniu aplikacji . Potwierdziliśmy, że JCE zostało zainstalowane, wykonując this script i zwracając uwagę, że wyjątek nie został zgłoszony.

Próbowałem również połączyć się ze zdalnym udziałem SFTP z terminala przy użyciu polecenia sftp w trybie szczegółowym. Oto co mam:

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011 
debug1: Reading configuration data /etc/ssh_config 
debug1: /etc/ssh_config line 20: Applying options for * 
debug1: /etc/ssh_config line 102: Applying options for * 
debug2: ssh_connect: needpriv 0 
debug1: Connecting to XXXXXXXXXXXXX [XXXXXXXXXXXX] port XX. 
debug1: Connection established. 
debug3: Incorrect RSA1 identifier 
debug3: Could not load "/Users/XXXXX/.ssh/id_rsa" as a RSA1 public key 
debug1: identity file /Users/XXXXX/.ssh/id_rsa type 1 
debug1: identity file /Users/XXXXX/.ssh/id_rsa-cert type -1 
debug1: identity file /Users/XXXXX/.ssh/id_dsa type -1 
debug1: identity file /Users/XXXXX/.ssh/id_dsa-cert type -1 
debug1: Enabling compatibility mode for protocol 2.0 
debug1: Local version string SSH-2.0-OpenSSH_6.2 
debug1: Remote protocol version 2.0, remote software version 3.2.9 SSH Secure Shell 
debug1: no match: 3.2.9 SSH Secure Shell 
debug2: fd 3 setting O_NONBLOCK 
debug3: load_hostkeys: loading entries for host "XXXXXXXXXXXXX" from file "/Users/XXXXX/.ssh/known_hosts" 
debug3: load_hostkeys: loaded 0 keys 
debug1: SSH2_MSG_KEXINIT sent 
debug3: Received SSH2_MSG_IGNORE 
debug1: SSH2_MSG_KEXINIT received 
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected],ssh-rsa,ssh-dss 
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected],[email protected],aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,[email protected],[email protected],aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected] 
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-md5,hmac-sha1,[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96 
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],hmac-md5,hmac-sha1,[email protected],[email protected],hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hm[email protected],hmac-sha1-96,hmac-md5-96 
debug2: kex_parse_kexinit: none,[email protected],zlib 
debug2: kex_parse_kexinit: none,[email protected],zlib 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: first_kex_follows 0 
debug2: kex_parse_kexinit: reserved 0 
debug2: kex_parse_kexinit: diffie-hellman-group1-sha1 
debug2: kex_parse_kexinit: ssh-dss 
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour 
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour 
debug2: kex_parse_kexinit: hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96 
debug2: kex_parse_kexinit: hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96 
debug2: kex_parse_kexinit: none,zlib 
debug2: kex_parse_kexinit: none,zlib 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: first_kex_follows 0 
debug2: kex_parse_kexinit: reserved 0 
debug2: mac_setup: found hmac-md5 
debug1: kex: server->client aes128-cbc hmac-md5 none 
debug2: mac_setup: found hmac-md5 
debug1: kex: client->server aes128-cbc hmac-md5 none 
debug2: dh_gen_key: priv key bits set: 122/256 
debug2: bits set: 496/1024 
debug1: sending SSH2_MSG_KEXDH_INIT 
debug1: expecting SSH2_MSG_KEXDH_REPLY 
debug3: Received SSH2_MSG_IGNORE 
debug1: Server host key: DSA XXXXXXXXXXXXXXXXXXXXXXXX 
debug3: load_hostkeys: loading entries for host "XXXXXXXXXXXXX" from file "/Users/XXXXX/.ssh/known_hosts" 
debug3: load_hostkeys: loaded 0 keys 
debug3: load_hostkeys: loading entries for host "XXXXXXXXXXXX" from file "/Users/XXXXX/.ssh/known_hosts" 
debug3: load_hostkeys: loaded 0 keys 
    The authenticity of host 'XXXXXXXXXXXXX (XXXXXXXXXXXX)' can't be established. 
    DSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXX. 
    Are you sure you want to continue connecting (yes/no)? yes 
    Warning: Permanently added 'XXXXXXXXXXXXX,XXXXXXXXXXXX' (DSA) to the list of known hosts. 
debug2: bits set: 516/1024 
debug1: ssh_dss_verify: signature correct 
debug2: kex_derive_keys 
debug2: set_newkeys: mode 1 
debug1: SSH2_MSG_NEWKEYS sent 
debug1: expecting SSH2_MSG_NEWKEYS 
debug3: Received SSH2_MSG_IGNORE 
debug2: set_newkeys: mode 0 
debug1: SSH2_MSG_NEWKEYS received 
debug1: Roaming not allowed by server 
debug1: SSH2_MSG_SERVICE_REQUEST sent 
debug3: Received SSH2_MSG_IGNORE 
debug2: service_accept: ssh-userauth 
debug1: SSH2_MSG_SERVICE_ACCEPT received 
debug2: key: /Users/XXXXX/.ssh/id_rsa (0x7f8e28500a10), 
debug2: key: /Users/XXXXX/.ssh/id_dsa (0x0), 
debug3: Received SSH2_MSG_IGNORE 
debug1: Authentications that can continue: publickey,password 
debug3: start over, passed a different list publickey,password 
debug3: preferred publickey,keyboard-interactive,password 
debug3: authmethod_lookup publickey 
debug3: remaining preferred: keyboard-interactive,password 
debug3: authmethod_is_enabled publickey 
debug1: Next authentication method: publickey 
debug1: Offering RSA public key: /Users/XXXXX/.ssh/id_rsa 
debug3: send_pubkey_test 
debug2: we sent a publickey packet, wait for reply 
debug3: Received SSH2_MSG_IGNORE 
debug1: Authentications that can continue: password 
debug3: start over, passed a different list password 
debug3: preferred publickey,keyboard-interactive,password 
debug3: authmethod_lookup password 
debug3: remaining preferred: ,keyboard-interactive,password 
debug3: authmethod_is_enabled password 
debug1: Next authentication method: password 

Jeśli mam poprawnie czyta wyjście (i nie może być) proces uzgadniania rozliczane za pomocą aes128-cbc do wymiany kluczy i hmac-md5 dla faktycznego szyfrowania sesji. Według the JSCH documentation (choć minimalna może być), oba te algorytmy są obsługiwane.

Mogę połączyć się z tym udziałem za pomocą narzędzia wiersza polecenia sftp i FileZilla, więc problem musi być albo z JSCH, albo z moją konfiguracją Java, ale nie mam pojęcia, co to jest.

wersja Java:

java version "1.7.0_71" 
OpenJDK Runtime Environment 
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) 

wersja jsch:

<dependency> 
    <groupId>com.jcraft</groupId> 
    <artifactId>jsch</artifactId> 
    <version>0.1.51</version> 
</dependency> 

Z góry dzięki!

EDYTOWANIE: Wygląda na to, że a bug for this exact behaviour zostało złożone przeciwko JDK, ale zostało zamknięte bez żadnej rozdzielczości. Istnieje również an email thread między opiekunami JSCH i programistami JDK, który omawia problem, ale nie ma rozwiązania.

+0

Wow. Wpadłem tutaj, żeby polecić JCE, ale wygląda na to, że wykonałeś pracę domową (nie, że to powinno być problem, ale tak samo). Jest szansa, że ​​mógłbyś spróbować z Oracle Java (zamiast OpenJDK) 7? Nie chcę być niejasny, ale miałem pecha z OpenJDK w przeszłości. W tym momencie powiedziałbym, że Oracle Java byłaby co najmniej warta spróbowania. Być może będziesz musiał zainstalować JCE w tym miejscu (chwalę się tutaj słomkami, mając tylko nadzieję, że mogę pomóc) –

+0

Kilka wyjaśnień: (1) Nie zainstalowałeś JCE, który jest już w pakiecie Javy. Zainstalowałeś "Unlimited Strength Policy", która jest * dodatkiem do * JCE. To ma znaczenie tylko wtedy, gdy pożądane/wynegocjowane szyfrowanie symetryczne przekracza 128 bitów, co wydaje się, że nie jest tak w twoim przypadku. (2) Twój handshake sftp wybrał 'aes128-cbc' dla * szyfrowania * i' hmac-md5' dla * sprawdzania integralności *; wymiana kluczy to Diffie-Hellman, uwierzytelnianie hosta to DSA, a uwierzytelnianie klienta wydaje się być hasłem. ... –

+0

... (3) Użyte grupy DH i DSA wydają się być 1024-bitowe, co powinno być w porządku dla Java 7. Ale w przypadku, gdy dane wyjściowe debugowania nie są dokładne i wiarygodne, może pomóc uzyskać dostęp do sieci Śledź zwłaszcza próby JSCH z Wireshark lub podobnym, aby upewnić się i zobaczyć dokładnie, kiedy się nie powiedzie. Lub jeśli możesz przetestować z Javą 8, która rozszerza ograniczenia dla DH i DSA (chociaż możesz lub nie chcesz 8 z innych powodów). –

Odpowiedz

2

Skończyliśmy na zamianie JSCH na SSHJ. Zależy to od bibliotek kryptograficznych BouncyCastle, a nie od wbudowanych pakietów kryptograficznych Java i jest w stanie połączyć się z naszym serwerem bez żadnych problemów.

-1

Instalacja Java Cryptography Extension (JCE) Zasady Nieograniczona Wytrzymałość Jurysdykcja Pliki click here to download

Wymień local_policy.jar i US_export_policy.jar nieograniczony plików polityki w następującej lokalizacji: Java \ jre7 \ lib \ Security \

Miałem podobny problem podczas szyfrowania danych za pomocą ibm jre w wersji 1.5 i tomcat.

+0

Proszę przeczytać oryginalny post w całości. Próbowaliśmy zainstalować pliki zasad jurysdykcji nieograniczonej siły, a to nie pomogło – MusikPolice

0

W rzeczywistości, bug for this behaviour, który został złożony przeciwko JDK nie został zamknięty - decyzja o zamknięciu została cofnięta i została zmieniona kilka dni później.Później został przeniesiony, więc uaktualnienie do Java SE 8u45 (lub wyżej) rozwiązuje również problem.

1

Można wymusić jsch użyć SHA256 zamiast SHA1 z keysize > 1024 (co JSSE nie pozwala już) tak:

java.util.Properties configuration = new java.util.Properties(); 
configuration.put("kex", "diffie-hellman-group-exchange-sha256");   
configuration.put("StrictHostKeyChecking", "no"); 
session.setConfig(configuration); 
Powiązane problemy