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.
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 dan Server Temp Key
lebih tinggi karena beberapa baris lebih tinggi. Meskipun server yang baik biasanya harus membuat ukuran DHE sama dengan ukuran RSA-auth.
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.