Ketika saya membuat koneksi SSL dengan beberapa server IRC (tetapi tidak yang lain - mungkin karena metode enkripsi yang disukai server) saya mendapatkan pengecualian berikut:
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
Penyebab terakhir:
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
Contoh server yang menunjukkan masalah ini adalah aperture.esper.net:6697 (ini adalah server IRC). Contoh server yang tidak menunjukkan masalah adalah kornbluth.freenode.net:6697. [Tidak mengherankan, semua server di setiap jaringan berbagi perilaku masing-masing yang sama.]
Kode saya (yang seperti diketahui tidak berfungsi saat menghubungkan ke beberapa server SSL) adalah:
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();
Ini startHandshake terakhir yang melempar pengecualian. Dan ya ada beberapa keajaiban yang terjadi dengan 'trustAllCerts'; kode itu memaksa sistem SSL untuk tidak memvalidasi sertifikat. (Jadi ... bukan masalah sertifikat.)
Jelas satu kemungkinan adalah bahwa server esper salah konfigurasi, tetapi saya mencari dan tidak menemukan referensi lain kepada orang-orang yang memiliki masalah dengan port SSL esper, dan 'openssl' menghubungkannya (lihat di bawah). Jadi saya bertanya-tanya apakah ini adalah batasan dukungan Java default SSL, atau sesuatu. Ada saran?
Inilah yang terjadi ketika saya terhubung ke aperture.esper.net 6697 menggunakan 'openssl' dari commandline:
~ $ 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)
---
Seperti yang disebutkan, setelah semua itu, itu berhasil terhubung yang lebih dari yang bisa Anda katakan untuk aplikasi Java saya.
Jika itu relevan, saya menggunakan OS X 10.6.8, Java versi 1.6.0_26.
Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
. Tidak tahu ukuran apa yang dikirim oleh server di sini, dan apa spesifikasi mengatakan tentang ini.openssl
output dalam pertanyaan: "Cipher adalah DHE-RSA-AES256-SHA, kunci publik Server adalah 2048 bit". Dan 2048> 1024 :-).Server public key (size)
adalah, dan, adalah kunci dalam sertifikat tersebut.s_client
pada 2011 tidak menunjukkan kunci fana sama sekali; 1.0.2 di 2015 danServer Temp Key
lebih tinggi karena beberapa baris lebih tinggi. Meskipun server yang baik biasanya harus membuat ukuran DHE sama dengan ukuran RSA-auth.Jawaban:
Masalahnya adalah ukuran utama. Ukuran maksimum yang dapat diterima yang diterima Java adalah 1024 bit. Ini adalah masalah yang diketahui (lihat JDK-6521495 ).
Laporan bug yang saya tautkan dengan menyebutkan solusi menggunakan implementasi JCE BouncyCastle. Semoga itu bekerja untuk Anda.
MEMPERBARUI
Ini dilaporkan sebagai bug JDK-7044060 dan diperbaiki baru-baru ini.
Perhatikan, bagaimanapun, bahwa batas hanya dinaikkan menjadi 2048 bit. Untuk ukuran> 2048 bit, ada JDK-8072452 - Hapus ukuran utama maksimal DH Keys ; perbaikan tampaknya untuk 9.
sumber
Jawaban "Java Cryptography Extension (JCE) File Kebijakan Yurisdiksi Kekuatan Tidak Terbatas" tidak berfungsi untuk saya tetapi saran penyedia JCE The BouncyCastle berhasil.
Berikut adalah langkah-langkah yang saya ambil menggunakan Java 1.6.0_65-b14-462 di Mac OSC 10.7.5
1) Unduh guci ini:
bcprov-jdk15on-154.jar
bcprov-ext-jdk15on-154.jar
2) pindahkan guci ini ke $ JAVA_HOME / lib / ext
3) edit $ JAVA_HOME / lib / security / java.security sebagai berikut: security.provider.1 = org.bouncycastle.jce.provider.BouncyCastleProvider
restart aplikasi menggunakan JRE dan cobalah
sumber
Inilah solusi saya (java 1.6), juga akan tertarik mengapa saya harus melakukan ini:
Saya perhatikan dari javax.security.debug = ssl, bahwa kadang-kadang suite cipher yang digunakan adalah TLS_DHE _... dan kadang-kadang itu adalah TLS_ECDHE _. Nanti akan terjadi jika saya menambahkan BouncyCastle. Jika TLS_ECDHE_ dipilih, PALING DARI waktu itu bekerja, tetapi tidak SELALU, jadi menambahkan bahkan penyedia BouncyCastle tidak dapat diandalkan (gagal dengan kesalahan yang sama, setiap kali atau lebih). Saya kira di suatu tempat di implementasi SSL Sun kadang-kadang memilih DHE , kadang-kadang memilih ECDHE .
Jadi solusi yang diposting di sini bergantung pada penghapusan cipher TLS_DHE_ sepenuhnya. CATATAN: BouncyCastle TIDAK diperlukan untuk solusi.
Jadi buat file sertifikasi server dengan:
Simpan ini karena akan direferensikan nanti, daripada di sini adalah solusi untuk mendapatkan http SSL, tidak termasuk suite cipher TLS_DHE_.
Akhirnya di sini adalah bagaimana ini digunakan (certFilePath jika jalur sertifikat disimpan dari openssl):
sumber
jdk.tls.disabledAlgorithms=DHE, ECDHE
dalamJDK_HOME/jre/lib/security/java.security
juga bekerja dan menghindari semua kode ini.jdk.tls.disabledAlgorithms=DHE
. Menggunakan 1.7.0_85-b15.Jawaban di atas benar, tetapi dalam hal solusinya, saya punya masalah dengan implementasi BouncyCastle ketika saya menetapkannya sebagai penyedia pilihan:
Ini juga dibahas dalam satu utas forum yang saya temukan, yang tidak menyebutkan solusi. http://www.javakb.com/Uwe/Forum.aspx/java-programmer/47512/TLS-problems
Saya menemukan solusi alternatif yang berfungsi untuk kasus saya, meskipun saya sama sekali tidak senang dengan itu. Solusinya adalah mengaturnya sehingga algoritma Diffie-Hellman tidak tersedia sama sekali. Kemudian, seandainya server mendukung algoritma alternatif, itu akan memilih selama negosiasi normal. Jelas kelemahannya adalah jika seseorang entah bagaimana berhasil menemukan server yang hanya mendukung Diffie-Hellman pada 1024 bit atau kurang dari ini berarti ini tidak akan berfungsi di tempat yang dulu berfungsi sebelumnya.
Berikut adalah kode yang berfungsi diberikan SSLSocket (sebelum Anda menghubungkannya):
Menjijikan.
sumber
Anda dapat menonaktifkan DHE sepenuhnya di jdk Anda, mengedit jre / lib / security / java.security dan memastikan DHE dinonaktifkan, mis. Suka
jdk.tls.disabledAlgorithms=SSLv3, DHE
.sumber
Anda dapat menginstal penyedia secara dinamis:
1) Unduh guci ini:
bcprov-jdk15on-152.jar
bcprov-ext-jdk15on-152.jar
2) Copy toples ke
WEB-INF/lib
(atau classpath Anda)3) Tambahkan penyedia secara dinamis:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());
sumber
Ini adalah posting yang cukup lama, tetapi jika Anda menggunakan Apache HTTPD, Anda dapat membatasi ukuran DH. Lihat http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
sumber
Jika Anda menggunakan jdk1.7.0_04, tingkatkan ke jdk1.7.0_21. Masalah telah diperbaiki pada pembaruan itu.
sumber
Ada kemungkinan bahwa Anda memiliki dependensi Maven yang salah. Anda harus menemukan perpustakaan ini dalam hierarki ketergantungan Maven:
Jika Anda memiliki dependensi ini yang merupakan kesalahan, dan Anda harus melakukan ini:
Tambahkan ketergantungan:
Kecualikan dependensi ini dari artefak yang menyertakan dependensi yang salah, dalam kasus saya itu adalah:
sumber
Coba unduh "Java Cryptography Extension (JCE) File Kebijakan Yurisdiksi Kekuatan Tidak Terbatas" dari situs unduhan Java dan ganti file dalam JRE Anda.
Ini bekerja untuk saya dan saya bahkan tidak perlu menggunakan BouncyCastle - standar Sun JCE dapat terhubung ke server.
PS. Saya mendapat kesalahan yang sama (ArrayIndexOutOfBoundsException: 64) ketika saya mencoba menggunakan BouncyCastle sebelum mengubah file kebijakan, jadi sepertinya situasi kami sangat mirip.
sumber
Jika Anda masih tergigit oleh masalah ini DAN Anda menggunakan Apache httpd v> 2.4.7, coba ini: http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
disalin dari url :
Dimulai dengan versi 2.4.7, mod_ssl akan menggunakan parameter DH yang menyertakan bilangan prima dengan panjang lebih dari 1024 bit. Java 7 dan sebelumnya membatasi dukungan mereka untuk ukuran utama DH hingga maksimum 1024 bit.
Jika klien berbasis Java Anda membatalkan dengan pengecualian seperti java.lang.RuntimeException: Tidak dapat menghasilkan DH keypair dan java.security.InvalidAlgorithmParameterException: Ukuran prime harus lebih dari 64, dan hanya dapat berkisar dari 512 hingga 1024 (inklusif), dan httpd log kesalahan internal tlsv1 peringatan (nomor peringatan SSL 80) (pada info LogLevel atau lebih tinggi), Anda dapat mengatur ulang daftar kode mod_ssl dengan SSLCipherSuite (mungkin bersama dengan SSLHonorCipherOrder), atau Anda dapat menggunakan parameter DH khusus dengan prime 1024-bit , yang akan selalu didahulukan dari parameter DH bawaan.
Untuk menghasilkan parameter DH khusus, gunakan
perintah. Atau, Anda dapat menggunakan parameter DH 1024-bit standar berikut dari RFC 2409, bagian 6.2:
Tambahkan parameter khusus termasuk baris "BEGIN DH PARAMETERS" dan "END DH PARAMETERS" ke akhir file sertifikat pertama yang telah Anda konfigurasikan menggunakan arahan SSLCertificateFile.
Saya menggunakan java 1.6 di sisi klien, dan itu memecahkan masalah saya. Saya tidak menurunkan cipher suites atau suka, tetapi menambahkan param DH yang dihasilkan kustom ke file cert ..
sumber
Saya memiliki masalah yang sama dengan server Yandex Maps, JDK 1.6 dan Apache HttpClient 4.2.1. Kesalahannya adalah
dengan mengaktifkan debug oleh
-Djavax.net.debug=all
ada pesan di logSaya telah memperbaiki masalah ini dengan menambahkan perpustakaan BouncyCastle
bcprov-jdk16-1.46.jar
dan mendaftarkan penyedia di kelas layanan petaPenyedia terdaftar pada penggunaan pertama
MapService
.sumber
Saya mengalami kesalahan SSL pada server CentOS yang menjalankan JDK 6.
Rencana saya adalah menginstal versi JDK yang lebih tinggi (JDK 7) untuk hidup berdampingan dengan JDK 6 tetapi ternyata hanya menginstal JDK yang lebih baru
rpm -i
tidak cukup.Instalasi JDK 7 hanya akan berhasil dengan
rpm -U
opsi upgrade seperti yang diilustrasikan di bawah ini.1. Unduh JDK 7
2. Instalasi RPM gagal
3. Peningkatan RPM berhasil
4. Konfirmasikan versi baru
sumber
Memecahkan masalah dengan memutakhirkan ke JDK 8.
sumber
Saya menggunakan coldfusion 8 pada JDK 1.6.45 dan memiliki masalah dengan memberi saya salib merah bukan gambar, dan juga dengan cfhttp tidak dapat terhubung ke server web lokal dengan ssl.
skrip pengujian saya untuk mereproduksi dengan coldfusion 8 adalah
ini memberi saya kesalahan yang cukup umum dari "Pengecualian I / O: rekan tidak diautentikasi." Saya kemudian mencoba menambahkan sertifikat server termasuk root dan sertifikat menengah ke keystore java dan juga keystore coldfusion, tetapi tidak ada yang membantu. lalu aku memperdebatkan masalah dengan
dan mendapatkan
dan
Saya kemudian memiliki gagasan bahwa server web (apache dalam kasus saya) memiliki cipher yang sangat modern untuk ssl dan cukup ketat (memenuhi nilai +) dan menggunakan kunci hellmann diffie yang kuat dengan lebih dari 1024 bit. jelas, coldfusion dan java jdk 1.6.45 tidak bisa mengelola ini. Langkah selanjutnya dalam odysee adalah memikirkan menginstal penyedia keamanan alternatif untuk java, dan saya memutuskan untuk goyang istana. lihat juga http://www.itcsolutions.eu/2011/08/22/how-to-use-bouncy-castle-cryptographic-api-in-in-in-netbeans-or-eclipse-for-java-jse-projects/
Saya kemudian mengunduh
dari http://www.bouncycastle.org/latest_releases.html dan menginstalnya di bawah C: \ jdk6_45 \ jre \ lib \ ext atau di mana pun jdk Anda berada, dalam instalasi asli coldfusion 8 itu akan berada di bawah C: \ JRun4 \ jre \ lib \ ext tetapi saya menggunakan jdk yang lebih baru (1.6.45) yang terletak di luar direktori coldfusion. sangat penting untuk meletakkan bcprov-ext-jdk15on-156.jar di direktori \ ext (ini biayanya sekitar dua jam dan sedikit rambut ;-) lalu saya edit file C: \ jdk6_45 \ jre \ lib \ security \ java.security (dengan wordpad tidak dengan editor.exe!) dan dimasukkan ke dalam satu baris untuk penyedia baru. setelah itu daftar tampak seperti
(lihat yang baru di posisi 1)
kemudian restart layanan coldfusion sepenuhnya. kamu bisa kemudian
dan nikmati perasaan ... dan tentu saja
malam yang indah dan hari yang indah. Semoga ini akan membantu (sebagian atau sepenuhnya) kepada seseorang di luar sana. jika Anda memiliki pertanyaan, cukup kirimkan saya di info ... (domain di atas).
sumber
Jika server mendukung cipher yang tidak termasuk DH, Anda dapat memaksa klien untuk memilih cipher itu dan menghindari kesalahan DH. Seperti:
Perlu diingat bahwa menentukan sandi yang tepat cenderung rusak dalam jangka panjang.
sumber
Kami mendapat kesalahan pengecualian yang sama persis dikembalikan, untuk memperbaikinya setelah berjam-jam menjelajahi internet.
Kami mengunduh versi jdk tertinggi yang dapat kami temukan di oracle.com, menginstalnya dan mengarahkan server aplikasi Jboss ke direktori jdk baru yang diinstal.
Restart Jboss, diproses ulang, problemo diperbaiki !!!
sumber
Saya mendapatkan kesalahan ini dengan Bamboo 5.7 + proyek Gradle + Apache. Gradle mencoba mendapatkan beberapa dependensi dari salah satu server kami melalui SSL.
Larutan:
dengan OpenSSL:
contoh output:
Tambahkan output ke file sertifikat (untuk Apache -
SSLCertificateFile
param)Mulai ulang apache
Mulai ulang bambu
Cobalah untuk membangun proyek lagi
sumber
Saya digunakan untuk mendapatkan kesalahan serupa mengakses svn.apache.org dengan klien java SVN menggunakan IBM JDK. Saat ini, svn.apache.org pengguna preferensi cipher klien.
Setelah berjalan sekali saja dengan paket capture / javax.net.debug = SEMUA Saya bisa daftar hitam hanya satu cipher DHE dan hal-hal bekerja untuk saya (ECDHE malah dinegosiasikan sebagai gantinya).
Perbaikan cepat yang bagus ketika tidak mudah untuk mengubah klien.
sumber
Baru-baru ini saya memiliki masalah yang sama dan setelah memutakhirkan versi jdk dari 1.6.0_45 ke jdk1.7.0_191 yang menyelesaikan masalah.
sumber
Bagi saya, baris perintah berikut memperbaiki masalah ini:
java -jar -Dhttps.protocols=TLSv1.2 -Ddeployment.security.TLSv1.2=true -Djavax.net.debug=ssl:handshake XXXXX.jar
Saya menggunakan JDK 1.7.0_79
sumber