Khi tôi thực hiện kết nối SSL với một số máy chủ IRC (nhưng không phải các máy chủ khác - có lẽ là do phương thức mã hóa ưa thích của máy chủ), tôi gặp ngoại lệ sau:
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
Nguyên nhân cuối cùng:
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
Một ví dụ về máy chủ thể hiện vấn đề này là aperture.esper.net:6697 (đây là máy chủ IRC). Một ví dụ về máy chủ không thể hiện vấn đề là kornbluth.freenode.net:6697. [Không ngạc nhiên, tất cả các máy chủ trên mỗi mạng đều có chung hành vi tương ứng.]
Mã của tôi (như đã lưu ý không hoạt động khi kết nối với một số máy chủ SSL) là:
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();
Đó là sự khởi đầu cuối cùng. Bắt đầu ném ngoại lệ. Và vâng, có một số phép thuật đang diễn ra với 'Trust ALLCerts'; mã đó buộc hệ thống SSL không xác nhận certs. (Vì vậy ... không phải là vấn đề chứng chỉ.)
Rõ ràng một khả năng là máy chủ của esper bị định cấu hình sai, nhưng tôi đã tìm kiếm và không tìm thấy bất kỳ tài liệu tham khảo nào khác cho những người gặp vấn đề với các cổng SSL của esper và 'openssl' kết nối với nó (xem bên dưới). Vì vậy, tôi tự hỏi liệu đây có phải là một hạn chế của hỗ trợ SSL mặc định của Java hay không. Bất kỳ đề xuất?
Đây là những gì xảy ra khi tôi kết nối với aperture.esper.net 6697 bằng cách sử dụng 'openssl' từ dòng lệnh:
~ $ 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)
---
Như đã lưu ý, sau tất cả những điều đó, nó kết nối thành công, nhiều hơn những gì bạn có thể nói cho ứng dụng Java của tôi.
Nếu nó có liên quan, tôi đang sử dụng OS X 10.6.8, phiên bản Java 1.6.0_26.
openssl
đầu ra trong câu hỏi: "Mật mã là DHE-RSA-AES256-SHA, Khóa công khai của máy chủ là 2048 bit". Và 2048> 1024 :-).
Server public key (size)
đã, và là, chìa khóa trong chứng chỉ. s_client
năm 2011 không hiển thị khóa phù du nào cả; 1.0.2 trong năm 2015 trở lên làm Server Temp Key
một số dòng cao hơn. Mặc dù một máy chủ tốt thường nên tạo kích thước DHE giống như kích thước RSA-auth.
Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
. Không biết kích thước nào được gửi bởi máy chủ ở đây và thông số kỹ thuật nói gì về điều này.