Tôi có một chương trình Java kết nối với máy chủ web bằng SSL/TLS và gửi các yêu cầu HTTP khác nhau qua kết nối đó. Máy chủ là localhost và đang sử dụng chứng chỉ tự ký, nhưng mã của tôi đang sử dụng TrustManagers tùy chỉnh và bỏ qua chứng chỉ không hợp lệ. Nó đã hoạt động hoàn hảo cho đến bây giờ.Nhận SSLHandshakeException: handshake_failure mặc dù khách hàng của tôi bỏ qua tất cả các chứng chỉ
Sự khác biệt duy nhất trên máy chủ là nó được sử dụng để chạy jboss 6 và hiện đang chạy jboss 7. Tôi không chắc đây có phải là vấn đề về cấu hình hay không, có vấn đề với mã của tôi hay không các lỗi tương tự nếu tôi cố kết nối bằng các chương trình dựa trên Java khác như WebScarab hoặc ZAP.
Trong mọi trường hợp, có bất kỳ điều gì tôi có thể thực hiện với mã của mình để khắc phục sự cố này không? Dưới đây là lỗi đầy đủ:
Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
Dưới đây là các thông điệp debug trước sự thất bại:
main, WRITE: TLSv1 Handshake, length = 75
main, WRITE: SSLv2 client hello message, length = 101
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
Bạn có thể quan tâm đến điều này: http://stackoverflow.com/a/4686924/372643 – Bruno
@Bruno Yeah, tôi thấy rằng trước đó trong khi tìm kiếm trên Google. Đây có phải là lỗi trong Java không? Tôi không thể nhìn thấy nó như thế nào có thể/nên được mặc định hành vi khi tôi đã chỉ định SSLContext như TLS. – Rsaesha
Nó không phải là một lỗi, đó là do thiết kế (SSLv2 là cho comp phía sau.). Xem [JSSE Ref/SSLContext] (http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLContext): "* Ví dụ: getInstance (" SSLv3 ") có thể trả về một cá thể thực hiện "SSLv3" và "TLSv1" * [...] Bạn có thể kiểm soát giao thức nào thực sự được kích hoạt cho kết nối SSL bằng cách sử dụng phương thức setEnabledProtocols (String [] protocols) ". Trong trường hợp của bạn, 'https.protocols' sẽ xử lý' setEnabledProtocols' cho 'HttpsURLConnection'. – Bruno