2011-01-13 4 views
21

SSLSocket.getEnabledProtocols() 메서드는 [SSLv2Hello, SSLv3, TLSv1]을 반환합니다. JSSE는 하지 지원을하지 말 두 (틀림없이) 이전 참조를왜 Java의 SSLSocket이 버전 2 클라이언트를 보냅니 까?

main, WRITE: TLSv1 Handshake, length = 81 
main, WRITE: SSLv2 client hello message, length = 110 

하지만이 발견 : 나는 connect() 전화를 내가 SSL 디버깅이 켜져있을 때 그리고 실제로, 나는 V2 클라이언트 인사를 사용하는 것을 볼 수 SSL 버전 2 :

Fundamental Networking in Java에서 :

'SSLv2Hello는'자바는 SSLv2의 '헬로 메시지'로 핸드 쉐이크를 개시 할 수있는 의사 프로토콜입니다. 이것은 이 아니며은 Java에서 전혀 지원되지 않는 SSLv2 프로토콜을 사용합니다.

그리고 JSSE Reference Guide에서

는 :

J2SDK 1.4의 JSSE 구현하고 나중에 SSL 3.0 및 TLS 1.0을 구현합니다. SSL 2.0을 구현하지 않습니다.

지금, 나의 이해는 버전 2.0 클라이언트 인사 만 클라이언트 지원 SSL 버전 2.0을 수행 할 때 전송되어야한다는 것입니다. RFC 2246에서 : SSL 버전을 지원

TLS 1.0 클라이언트 2.0 서버는 SSL에게 버전 2.0 클라이언트 인사 메시지 [SSL2] ... 경고를 보내야합니다 : 능력을 2.0 클라이언트 인사 메시지를 단계적으로 폐지됩니다 버전을 보내 모든 서둘러.

그럼 Java에서 왜 사용합니까?

+0

SSLv2Hello는 기본적으로 Sun/Oracle Java 6의 JSSE에서는 켜져 있지만 Java 7 이상에서는 켜지지 않습니다. Java 6의 경우 www.howismyssl.com을 사용하여 연결을 여는 경우와 같은 문제가 발생합니다. – eckes

답변

17

Sun의 JSSE는 SSLv2를 지원하지 않지만 SSLv2를 필요로하는 일부 SSL 서버를 지원하기 위해 SSlv2ClientHello을 지원합니다. 활성화 된 프로토콜에서 제거하여 해제 할 수 있습니다.

IBM의 JSSE는 SSLv2를 완전히 지원합니다. JSSE Reference Guide에서

: 예를 들어

, 일부 구형 서버 구현은 SSLv3에만 은 TLS를 이해하지 않습니다. 이상적으로이 구현은 SSLv3으로 협상해야하지만 일부는 간단히 중단됩니다. 하위 호환성의 경우 일부 서버 구현 (예 : SunJSSE)은 SSLv3 ClientHellos를 SSLv2 ClientHello 패킷으로 캡슐화하여 전송합니다. 일부 서버는 에서이 형식을 허용하지 않습니다.이 경우 setEnabledProtocols를 으로 설정하여 캡슐화 된 SSLv2 ClientHellos 전송을 사용 중지합니다.

'서버 구현'이 위의 'SSL 구현'을 읽어야한다고 생각합니다.

편집 : 내 책을 인용 해 주셔서 감사합니다!

+0

답변 해 주셔서 감사합니다. 당신 V2 클라이언트 안녕하세요 주어진 이들 서버가 v3을 사용하여 응답한다는 말입니까? –

+0

또한 호기심에서 가이드가 어떤 서버를 가리키고 있는지 알 수 있습니까? ;-) –

+0

@Matt Solnit : (a) 예 (b) 아니요. – EJP