Phương thức SSLSocket.getEnabledProtocols()
trả về các mục sau: [SSLv2Hello, SSLv3, TLSv1]
. Và quả thực, khi tôi gọi connect()
và tôi có SSL gỡ lỗi bật lên, tôi thấy rằng một chào v2 khách hàng được sử dụng:Tại sao SSLSocket của Java gửi cho ứng dụng khách 2 phiên bản?
main, WRITE: TLSv1 Handshake, length = 81
main, WRITE: SSLv2 client hello message, length = 110
Nhưng tôi đã tìm thấy hai tài liệu tham khảo (phải thừa nhận là cũ) mà nói JSSE không không hỗ trợ SSL version 2:
Từ Fundamental Networking in Java:
'SSLv2Hello' là một pseudo-giao thức cho phép Java để bắt đầu bắt tay với một SSLv2 'hello thông báo'. Điều này không không gây ra việc sử dụng giao thức SSLv2, không được hỗ trợ bởi Java.
Và từ JSSE Reference Guide:
Việc thực hiện JSSE trong J2SDK 1.4 và sau đó thực hiện SSL 3.0 và TLS 1.0. Nó không thực hiện SSL 2.0.
Bây giờ, sự hiểu biết của tôi là phiên bản 2.0 của khách hàng chào chỉ nên được gửi khi khách hàng không hỗ trợ SSL version 2.0. Từ RFC 2246:
TLS 1.0 khách hàng có hỗ trợ SSL Version server 2.0 phải gửi SSL Phiên bản 2.0 client chào điệp [SSL2] ... Cảnh báo: Khả năng gửi Phiên bản 2.0 client chào thông điệp sẽ được loại bỏ với tất cả sự vội vàng.
Vậy tại sao Java sử dụng?
SSLv2Hello được bật theo mặc định trên JSSE của Sun/Oracle Java 6, nhưng không phải Java 7 trở lên. Nó phá vỡ cho ví dụ mở connectins với www.howismyssl.com cho Java 6. – eckes