일부 IRC 서버와 SSL 연결을 만들 때 (그러나 서버의 선호하는 암호화 방법으로 인해 다른 서버는 아님) 다음 예외가 발생합니다.
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
최종 원인 :
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
이 문제를 보여주는 서버의 예로는 aperture.esper.net:6697(IRC 서버)이 있습니다. 문제를 나타내지 않는 서버의 예는 kornbluth.freenode.net:6697입니다. [놀랍게도, 각 네트워크의 모든 서버는 동일한 동작을 공유합니다.]
내 코드 (일부 SSL 서버에 연결할 때 작동하는 것으로 언급 됨)는 다음과 같습니다.
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();
예외를 던지는 것은 마지막 startHandshake입니다. 그리고 'trustAllCerts'에는 약간의 마술이 있습니다. 이 코드는 SSL 시스템이 인증서의 유효성을 검사하지 않도록합니다. (그래서 ... 인증서 문제가 아닙니다.)
분명히 한 가지 가능성은 esper의 서버가 잘못 구성되었지만 esper의 SSL 포트에 문제가있는 사람들에 대한 다른 참조를 찾지 못했으며 'openssl'이 연결되어 있다는 것입니다 (아래 참조). 이것이 이것이 Java 기본 SSL 지원 또는 기타 제한 사항인지 궁금합니다. 어떤 제안?
커맨드 라인에서 'openssl'을 사용하여 aperture.esper.net 6697에 연결하면 어떻게됩니까?
~ $ 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)
---
언급했듯이, 결국 Java 연결에 대해 말할 수있는 것보다 성공적으로 연결됩니다.
관련이 있다면 OS X 10.6.8, Java 버전 1.6.0_26을 사용하고 있습니다.
openssl
는 DHE-RSA-AES256-SHA, 서버 공개 키는 2048 비트"라는 질문 에서 출력에 사용 된 서버의 크기를 볼 수 있습니다 . 그리고 2048> 1024 :-).
Server public key (size)
증명서의 열쇠였습니다. s_client
2011 년에는 임시 키가 전혀 표시되지 않았습니다. 2015 년 1.0.2 Server Temp Key
이상 은 몇 줄 더 높습니다. 좋은 서버는 일반적으로 DHE 크기를 RSA 인증 크기와 동일하게 만들어야합니다.
Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
.. 여기에서 서버가 어떤 크기를 보냈는지, 사양에 대해 무엇을 말했는지 모르겠습니다.