Kiedy nawiązuję połączenie SSL z niektórymi serwerami IRC (ale nie z innymi - prawdopodobnie ze względu na preferowaną metodę szyfrowania serwera) pojawia się następujący wyjątek:
Caused by: java.lang.RuntimeException: Could not generate DH keypair
at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:106)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:556)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:183)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
... 3 more
Ostateczna przyczyna:
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(DashoA13*..)
at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:627)
at com.sun.net.ssl.internal.ssl.DHCrypt.<init>(DHCrypt.java:100)
... 10 more
Przykładem serwera, który demonstruje ten problem jest aperture.esper.net:6697 (to jest serwer IRC). Przykładem serwera, który nie demonstruje problemu, jest kornbluth.freenode.net:6697. [Nic dziwnego, że wszystkie serwery w każdej sieci zachowują się tak samo.]
Mój kod (który, jak wspomniano, działa podczas łączenia się z niektórymi serwerami SSL) to:
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new SecureRandom());
s = (SSLSocket)sslContext.getSocketFactory().createSocket();
s.connect(new InetSocketAddress(host, port), timeout);
s.setSoTimeout(0);
((SSLSocket)s).startHandshake();
To ostatni startHandshake rzuca wyjątek. I tak, z „trustAllCerts” dzieje się jakaś magia; ten kod wymusza na systemie SSL, aby nie weryfikował certyfikatów. (Więc ... nie jest to pewien problem.)
Oczywiście jedną z możliwości jest to, że serwer espera jest źle skonfigurowany, ale przeszukałem i nie znalazłem żadnych innych odniesień do osób mających problemy z portami SSL espera i łączy się z nim „openssl” (patrz poniżej). Zastanawiam się więc, czy to jest ograniczenie domyślnej obsługi SSL w Javie, czy coś. Jakieś sugestie?
Oto, co się dzieje, gdy łączę się z aperture.esper.net 6697 za pomocą „openssl” z wiersza poleceń:
~ $ openssl s_client -connect aperture.esper.net:6697
CONNECTED(00000003)
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
verify return:1
---
Certificate chain
0 s:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
i:/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
---
Server certificate
-----BEGIN CERTIFICATE-----
[There was a certificate here, but I deleted it to save space]
-----END CERTIFICATE-----
subject=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
issuer=/C=GB/ST=England/L=London/O=EsperNet/OU=aperture.esper.net/CN=*.esper.net/emailAddress=support@esper.net
---
No client certificate CA names sent
---
SSL handshake has read 2178 bytes and written 468 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : DHE-RSA-AES256-SHA
Session-ID: 51F1D40A1B044700365D3BD1C61ABC745FB0C347A334E1410946DCB5EFE37AFD
Session-ID-ctx:
Master-Key: DF8194F6A60B073E049C87284856B5561476315145B55E35811028C4D97F77696F676DB019BB6E271E9965F289A99083
Key-Arg : None
Start Time: 1311801833
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
Jak już wspomniano, po tym wszystkim łączy się pomyślnie, co jest czymś więcej niż możesz powiedzieć o mojej aplikacji Java.
Jeśli ma to znaczenie, używam OS X 10.6.8, Java w wersji 1.6.0_26.
Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
. Nie mam pojęcia, jaki rozmiar przesłał tutaj serwer i co mówi o tym specyfikacja.openssl
wyjściowych można zobaczyć w pytaniu: „Szyfr to DHE-RSA-AES256-SHA, klucz publiczny serwera to 2048 bitów”. I 2048> 1024 :-).Server public key (size)
był i jest kluczem w cert.s_client
w 2011 roku w ogóle nie pokazał efemerycznego klucza; 1.0.2 w 2015 r. IServer Temp Key
nowsze działa tak samo, jak kilka linii wyżej. Chociaż dobry serwer zwykle powinien mieć taki sam rozmiar DHE jak rozmiar uwierzytelniania RSA.Odpowiedzi:
Problem tkwi w rozmiarze głównym. Maksymalny dopuszczalny rozmiar, jaki akceptuje Java, to 1024 bity. Jest to znany problem (zobacz JDK-6521495 ).
Raport o błędzie, że związana wspomina obejścia przy użyciu wdrażania BouncyCastle za JCE. Mam nadzieję, że to powinno Ci pomóc.
AKTUALIZACJA
Zostało to zgłoszone jako błąd JDK-7044060 i niedawno naprawione.
Należy jednak pamiętać, że limit został podniesiony tylko do 2048 bitów. W przypadku rozmiarów> 2048 bitów istnieje JDK-8072452 - Usuń maksymalny główny rozmiar kluczy DH ; wydaje się, że poprawka dotyczy 9.
źródło
Odpowiedź „Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files” nie zadziałała w moim przypadku, ale sugestia dostawcy JCE w BouncyCastle tak.
Oto kroki, które wykonałem, używając języka Java 1.6.0_65-b14-462 w systemie Mac OSC 10.7.5
1) Pobierz te słoiki:
bcprov-jdk15on-154.jar
bcprov-ext-jdk15on-154.jar
2) przenieś te pliki jar do $ JAVA_HOME / lib / ext
3) Edytuj plik $ JAVA_HOME / lib / security / java.security w następujący sposób: security.provider.1 = org.bouncycastle.jce.provider.BouncyCastleProvider
uruchom ponownie aplikację przy użyciu środowiska JRE i spróbuj
źródło
Oto moje rozwiązanie (java 1.6), również byłbym zainteresowany, dlaczego musiałem to zrobić:
Zauważyłem z javax.security.debug = ssl, że czasami używany zestaw szyfrów to TLS_DHE _..., a czasami jest to TLS_ECDHE _..... Później wydarzy się, gdy dodam BouncyCastle. Jeśli wybrano TLS_ECDHE_, PRZEZ WIĘKSZOŚĆ czasu działało, ale nie ZAWSZE, więc dodanie nawet dostawcy BouncyCastle było zawodne (nie powiodło się z tym samym błędem, mniej więcej co drugi raz). Wydaje mi się, że gdzieś w implementacji Sun SSL czasami wybiera DHE , a czasami ECDHE .
Dlatego rozwiązanie zamieszczone tutaj polega na całkowitym usunięciu szyfrów TLS_DHE_. UWAGA: BouncyCastle NIE jest wymagane do rozwiązania.
Utwórz więc plik certyfikacji serwera przez:
Zapisz to, ponieważ będzie przywoływane później, niż tutaj jest rozwiązanie dla SSL http get, z wyłączeniem zestawów szyfrowania TLS_DHE_.
Wreszcie, jak jest używany (certFilePath, jeśli ścieżka certyfikatu zapisanego z openssl):
źródło
jdk.tls.disabledAlgorithms=DHE, ECDHE
wJDK_HOME/jre/lib/security/java.security
również działa i uniknąć wszystkich ten kod.jdk.tls.disabledAlgorithms=DHE
. Używając 1.7.0_85-b15.Powyższa odpowiedź jest poprawna, ale jeśli chodzi o obejście, miałem problemy z implementacją BouncyCastle, kiedy ustawiłem ją jako preferowanego dostawcę:
Jest to również omówione w jednym znalezionym wątku na forum, który nie wspomina o rozwiązaniu. http://www.javakb.com/Uwe/Forum.aspx/java-programmer/47512/TLS-problems
Znalazłem alternatywne rozwiązanie, które działa w moim przypadku, chociaż wcale nie jestem z niego zadowolony. Rozwiązaniem jest ustawienie go tak, aby algorytm Diffiego-Hellmana nie był w ogóle dostępny. Następnie, zakładając, że serwer obsługuje alternatywny algorytm, będzie wybierał podczas normalnej negocjacji. Oczywiście wadą tego rozwiązania jest to, że jeśli komuś uda się znaleźć serwer, który obsługuje tylko Diffie-Hellman przy 1024 bitach lub mniej, oznacza to, że nie będzie on działał tam, gdzie działał wcześniej.
Oto kod, który działa przy SSLSocket (przed połączeniem):
Paskudny.
źródło
Możesz całkowicie wyłączyć DHE w swoim jdk, edytować jre / lib / security / java.security i upewnić się, że DHE jest wyłączone, np. lubić
jdk.tls.disabledAlgorithms=SSLv3, DHE
.źródło
Dostawcę można zainstalować dynamicznie:
1) Pobierz te słoiki:
bcprov-jdk15on-152.jar
bcprov-ext-jdk15on-152.jar
2) Skopiuj słoiki do
WEB-INF/lib
(lub swoją ścieżkę klas)3) Dodaj dostawcę dynamicznie:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());
źródło
To dość stary post, ale jeśli używasz Apache HTTPD, możesz ograniczyć rozmiar DH. Zobacz http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
źródło
Jeśli używasz jdk1.7.0_04, zaktualizuj do jdk1.7.0_21. Problem został rozwiązany w tej aktualizacji.
źródło
Możliwe, że masz nieprawidłowe zależności Maven. Musisz znaleźć te biblioteki w hierarchii zależności Maven:
Jeśli masz te zależności, to jest błąd i powinieneś to zrobić:
Dodaj zależność:
Wyklucz te zależności z artefaktu, który zawierał złe zależności, w moim przypadku jest to:
źródło
Spróbuj pobrać plik „Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files” z witryny pobierania oprogramowania Java i zamień pliki w środowisku JRE.
To zadziałało dla mnie i nie musiałem nawet używać BouncyCastle - standardowy Sun JCE był w stanie połączyć się z serwerem.
PS. Otrzymałem ten sam błąd (ArrayIndexOutOfBoundsException: 64), gdy próbowałem użyć BouncyCastle przed zmianą plików zasad, więc wygląda na to, że nasza sytuacja jest bardzo podobna.
źródło
Jeśli nadal gryzie Cię ten problem ORAZ używasz Apache httpd v> 2.4.7, spróbuj tego: http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
skopiowane z adresu URL :
Począwszy od wersji 2.4.7, mod_ssl będzie używać parametrów DH, które obejmują liczby pierwsze o długości większej niż 1024 bity. Jednak Java 7 i wcześniejsze ograniczają obsługę rozmiarów głównych DH do maksymalnie 1024 bitów.
Jeśli klient oparty na języku Java przerywa działanie z wyjątkami, takimi jak java.lang.RuntimeException: nie można wygenerować pary kluczy DH i java.security.InvalidAlgorithmParameterException: rozmiar główny musi być wielokrotnością 64 i może zawierać się tylko w zakresie od 512 do 1024 (włącznie), oraz httpd loguje błąd wewnętrzny alertu tlsv1 (numer alertu SSL 80) (na poziomie LogLevel lub wyższym), możesz zmienić kolejność listy szyfrów mod_ssl za pomocą SSLCipherSuite (prawdopodobnie w połączeniu z SSLHonorCipherOrder) lub użyć niestandardowych parametrów DH z 1024-bitową liczbą pierwszą , który zawsze będzie miał pierwszeństwo przed jakimikolwiek wbudowanymi parametrami DH.
Aby wygenerować niestandardowe parametry DH, użyj
Komenda. Alternatywnie możesz użyć następujących standardowych parametrów 1024-bitowych DH z RFC 2409, sekcja 6.2:
Dodaj parametry niestandardowe, w tym wiersze „BEGIN DH PARAMETERS” i „END DH PARAMETERS”, na końcu pierwszego pliku certyfikatu skonfigurowanego za pomocą dyrektywy SSLCertificateFile.
Używam Java 1.6 po stronie klienta i to rozwiązało mój problem. Nie obniżyłem zestawów szyfrów ani podobnych, ale dodałem niestandardowy parametr DH do pliku certyfikatu.
źródło
Mam ten sam problem z serwerem Yandex Maps, JDK 1.6 i Apache HttpClient 4.2.1. Błąd był
z włączonym debugowaniem,
-Djavax.net.debug=all
w dzienniku pojawił się komunikatRozwiązałem ten problem, dodając bibliotekę BouncyCastle
bcprov-jdk16-1.46.jar
i rejestrując dostawcę w klasie usług mapDostawca jest zarejestrowany przy pierwszym użyciu
MapService
.źródło
Napotkałem błąd SSL na serwerze CentOS z JDK 6.
Planowałem zainstalować nowszą wersję JDK (JDK 7), aby współistnieć z JDK 6, ale okazuje się, że samo zainstalowanie nowszego JDK z
rpm -i
nie wystarczyło.Instalacja JDK 7 zakończy się powodzeniem tylko z
rpm -U
opcją aktualizacji, jak pokazano poniżej.1. Pobierz JDK 7
2. Instalacja RPM nie powiodła się
3. Aktualizacja RPM powiodła się
4. Potwierdź nową wersję
źródło
Rozwiązano problem, aktualizując do JDK 8.
źródło
Używam coldfusion 8 na JDK 1.6.45 i miałem problemy z podaniem mi tylko czerwonych krzyżyków zamiast obrazów, a także z cfhttp nie mogącym połączyć się z lokalnym serwerem WWW przez ssl.
moim skryptem testowym do odtworzenia z coldfusion 8 był
spowodowało to dość ogólny błąd „Wyjątek we / wy: peer nie uwierzytelniony”. Następnie próbowałem dodać certyfikaty serwera, w tym certyfikaty główne i pośrednie, do magazynu kluczy java, a także do magazynu kluczy coldfusion, ale nic nie pomogło. następnie zdebugowałem problem z
i dostał
i
Wtedy wpadłem na pomysł, że serwer WWW (w moim przypadku apache) ma bardzo nowoczesne szyfry dla ssl i jest dość restrykcyjny (ocena jakości a +) i używa silnych kluczy diffie hellmann z więcej niż 1024 bitami. oczywiście, coldfusion i java jdk 1.6.45 nie mogą sobie z tym poradzić. Następnym krokiem w odysee była myśl o zainstalowaniu alternatywnego dostawcy zabezpieczeń dla javy i zdecydowałem się na dmuchany zamek. zobacz także http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-netbeans-or-eclipse-for-java-jse-projects/
Następnie pobrałem
z http://www.bouncycastle.org/latest_releases.html i zainstalowałem go pod C: \ jdk6_45 \ jre \ lib \ ext lub gdziekolwiek jest twój jdk, w oryginalnej instalacji coldfusion 8 znajdowałby się pod C: \ JRun4 \ jre \ lib \ ext, ale używam nowszego jdk (1.6.45) znajdującego się poza katalogiem coldfusion. bardzo ważne jest, aby umieścić bcprov-ext-jdk15on-156.jar w katalogu \ ext (kosztowało mnie to około dwie godziny i trochę włosów ;-), a potem wyedytowałem plik C: \ jdk6_45 \ jre \ lib \ security \ java.security (z wordpadem nie z editor.exe!) i umieść w jednej linii dla nowego dostawcy. potem lista wyglądała
(zobacz nowy w pozycji 1)
następnie całkowicie zrestartuj usługę coldfusion. możesz wtedy
i ciesz się tym uczuciem ... i oczywiście
co za noc i co za dzień. Miejmy nadzieję, że to pomoże (częściowo lub całkowicie) komuś tam. jeśli masz pytania, napisz do mnie na info ... (domena powyżej).
źródło
Jeśli serwer obsługuje szyfr, który nie zawiera DH, można zmusić klienta do wybrania tego szyfru i uniknąć błędu DH. Jak na przykład:
Pamiętaj, że określenie dokładnego szyfru jest podatne na złamanie w dłuższej perspektywie.
źródło
Otrzymaliśmy ten sam dokładny błąd wyjątku, aby go naprawić po wielu godzinach przeglądania Internetu.
Pobraliśmy najwyższą wersję jdk, jaką mogliśmy znaleźć na oracle.com, zainstalowaliśmy ją i wskazaliśmy serwer aplikacji Jboss na katalog z zainstalowanym nowym jdk.
Ponownie uruchomiono Jboss, ponownie przetworzono, problem został rozwiązany !!!
źródło
Mam ten błąd w Bamboo 5.7 + projekt Gradle + Apache. Gradle próbował uzyskać zależności z jednego z naszych serwerów za pośrednictwem protokołu SSL.
Rozwiązanie:
z OpenSSL:
przykładowe dane wyjściowe:
Dołącz dane wyjściowe do pliku certyfikatu (dla Apache -
SSLCertificateFile
param)Zrestartuj Apache
Uruchom ponownie Bamboo
Spróbuj ponownie zbudować projekt
źródło
Kiedyś otrzymywałem podobny błąd podczas uzyskiwania dostępu do svn.apache.org z klientami Java SVN używającymi IBM JDK. Obecnie svn.apache.org użytkownicy korzystają z preferencji szyfrowania klientów.
Po uruchomieniu tylko raz z przechwytywaniem pakietów / javax.net.debug = ALL udało mi się umieścić na czarnej liście tylko jeden szyfr DHE i wszystko działa dla mnie (zamiast tego negocjowane jest ECDHE).
Dobra, szybka naprawa, gdy zmiana klienta nie jest łatwa.
źródło
Ostatnio mam ten sam problem i po uaktualnieniu wersji jdk z wersji 1.6.0_45 do jdk1.7.0_191 co rozwiązało problem.
źródło
U mnie następująca linia poleceń rozwiązała problem:
java -jar -Dhttps.protocols=TLSv1.2 -Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake XXXXX.jar
Używam JDK 1.7.0_79
źródło