Bazı IRC sunucuları ile SSL bağlantısı kurduğumda (ancak diğerleri değil - muhtemelen sunucunun tercih ettiği şifreleme yöntemi nedeniyle) aşağıdaki istisnayı alıyorum:
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
Son neden:
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
Bu sorunu gösteren bir sunucu örneği aperture.esper.net:6697'dir (bu bir IRC sunucusudur). Sorunu göstermeyen bir sunucu örneği kornbluth.freenode.net:6697. [Şaşırtıcı olmayan bir şekilde, her ağdaki tüm sunucular aynı davranışları paylaşır.]
Kodum (belirtildiği gibi bazı SSL sunucularına bağlanırken çalışır):
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();
İstisnayı atan el sıkışması. Ve evet 'trustAllCerts' ile biraz sihir oluyor; bu kod SSL sistemini sertifikaları doğrulamamaya zorlar. (Yani ... sertifika sorunu değil.)
Açıkçası bir olasılık, esper sunucusunun yanlış yapılandırılmış olması, ancak aradım ve esper'in SSL bağlantı noktalarında sorun yaşayan insanlara başka referanslar bulamadım ve 'openssl' ona bağlanıyor (aşağıya bakın). Bunun Java varsayılan SSL desteğinin bir kısıtlaması olup olmadığını merak ediyorum. Baska öneri?
Komut satırından 'openssl' kullanarak aperture.esper.net 6697'ye bağlandığımda şöyle olur:
~ $ 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)
---
Belirtildiği gibi, bundan sonra, Java uygulamam için söyleyebileceğinizden daha fazla olan başarılı bir şekilde bağlanıyor.
İlgili olması durumunda, OS X 10.6.8, Java sürüm 1.6.0_26 kullanıyorum.
openssl
çıkışta kullanılan boyutu görebilirsiniz : "Şifre DHE-RSA-AES256-SHA, Sunucu ortak anahtarı 2048 bit". Ve 2048> 1024 :-).
Server public key (size)
sertifikadaki anahtar buydu. s_client
2011 yılında geçici bir anahtar göstermedi; 1.0.2 ve üstü Server Temp Key
sürümlerde birkaç satır daha yüksek. Her ne kadar iyi bir sunucu genellikle DHE boyutunu RSA-auth boyutuyla aynı yapmalıdır .
Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
. Burada sunucu tarafından hangi boyutun gönderildiğine ve spesifikasyonun bu konuda ne söylediğine dair bir fikrim yok.