2011-01-13 42 views
21

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?

+0

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

Trả lời

17

JSSE của Sun không hỗ trợ SSLv2 nhưng hỗ trợ SSlv2ClientHello, để hỗ trợ một số máy chủ SSL yêu cầu. Bạn có thể tắt nó đi bằng cách loại bỏ nó khỏi các giao thức được kích hoạt.

JSSE của IBM hỗ trợ SSLv2 hoàn toàn.

Từ JSSE Reference Guide:

Ví dụ, một số máy chủ cũ triển khai chỉ nói SSLv3 và không hiểu TLS. Lý tưởng nhất, các triển khai này nên thương lượng với SSLv3, nhưng một số chỉ đơn giản là gác máy. Đối với khả năng tương thích ngược, một số máy chủ triển khai (chẳng hạn như SunJSSE) gửi SSLv3/TLS ClientHellos được đóng gói trong gói SSLv2 ClientHello. Một số máy chủ không chấp nhận định dạng này, trong các trường hợp này sử dụng setEnabledProtocols để vô hiệu hoá việc gửi gói được đóng gói SSLv2 ClientHellos.

Tôi tưởng tượng 'triển khai máy chủ' nên đọc 'triển khai SSL' ở trên.

CHỈNH SỬA: cảm ơn bạn đã trích dẫn cuốn sách của mình!

+0

Cảm ơn câu trả lời của bạn. Bạn có nói rằng những máy chủ này, được cung cấp cho ứng dụng khách chào V2, sẽ phản hồi bằng cách sử dụng v3? –

+0

Ngoài ra, trong tò mò, bạn có bất kỳ ý tưởng mà các máy chủ hướng dẫn được đề cập đến? ;-) –

+0

@Matt Solnit: (a) có (b) không. – EJP

Các vấn đề liên quan