2011-03-26 2 views
3

광범위하게 JSSE를 사용하는 프로젝트가 있습니다.TLS 1.0 클라이언트와 SSL 3.0 서버간에 핸드 셰이크 실패가 발생하는 이유는 무엇입니까?

구성 매개 변수에 따라 SSLContext는 SSLv3으로 초기화됩니다. 매개 변수가 설정되지 않은 경우 SSLv3이고, 그렇지 않으면 TLS입니다.

나는 때때로 일부 핸드 셰이크 오류를 발견하고 추적 : 클라이언트가 TLS 협상하면 서버는 핸드 쉐이크가

왜 이런 일이 않는

실패, SSLv3과 대답? 나는 TLS와 SSLv3이 꽤 많이 상호 교환 할 수 있다고 생각했다. 그렇지 않습니까? 서버 측을 항상 변경하면 TLS이 응답 할 수있는 기회가 있습니까?

+0

코드가 클라이언트 측입니까, 아니면 서버 측입니까? –

+0

@ GregS : 나는 양쪽을 제어한다. 그러나 클라이언트 부분은 광산 외에도 다른 https 서버와 접촉한다. – Cratylus

답변

3

TLS 1.0은 내부적으로 SSL 3.1입니다. 클라이언트와 서버 중 하나 또는 둘 모두를 사용하도록 허용 할 수 있습니다. 핸드 셰이크가 진행되는 동안 클라이언트는 알고있는 가장 높은 프로토콜 버전을 전송하고 서버 은 클라이언트가 보낸 최신 버전보다 항상 최신이 아닌 지원하는 가장 높은 버전을으로 선택해야합니다.

내 생각 엔 당신은 TLS를 사용하도록 클라이언트를 구성 할 때, 다음 클라이언트는 " TLS 1.0을 사용하여"로 이해하는 것입니다 : 클라이언트가 "3.1"을 전송하고, 서버가 3.0 "로 응답하도록 구성되어있는 경우 "면, 클라이언트는 논리적으로 연결을 거부합니다. 당신이 무엇을해야

은 모두 3.0 3.1, 따라서이 어떤 프로토콜 버전하면 클라이언트에 의해 발표 된 사용하십시오 허용하도록 서버를 구성하는 방법을 찾을 수 있습니다. 또는 3.1을 알고 있다고 선언하도록 클라이언트를 구성하지만 서버가 그렇게 말하면 3.0으로의 "다운 그레이드"도 허용합니다.

+0

그래서 SSL3.1 및 3.0은 호환되지 않습니다.이 (보통) 구성, 즉 3.0 및 3.1 또는 사용자 정의 코드를 모두 수용하도록 서버를 구성해야합니까? – Cratylus

+0

SSL 3.0 및 3.1은 정확히 동일한 프로토콜은 아니지만 첫 번째 클라이언트 메시지가 두 서버 모두에서 작동 할 수있는 충분한 구조를 공유하므로 서버가이를 결정할 수 있습니다. 이는 일반적으로 구성 문제입니다. 내부적으로 이것은 문자열의 배열을 허용하는'SSLServerSocket.setEnabledProtocols()'을 호출해야하며, 여러 프로토콜 (예 :' "SSLv3"'_and_' "TLSv1"')의 명세를 허용해야한다. –

1

당신은 프로토콜 매개 변수를 변경하여 달성하려는 것을 말하지 않습니다. SSLv3과 TLS1.0은 매우 유사하지만 그럼에도 불구하고 별개의 프로토콜입니다. SSLv3에 도입 된 프로토콜 협상 메커니즘은 후속 프로토콜에서도 사용됩니다. 결론은 SSLContext.getInstance("proto");에서 proto을 지원하려는 SSL 프로토콜의 가장 빠른 버전으로 설정해야한다는 것입니다. 그 후, 동료들은 그들이 지원하는 프로토콜의 최신 버전을 사용하기 위해 협상 할 것입니다.

+0

다양한 프로토콜 매개 변수가 더 엄격한 인증 표시로 사용된다. 다른 부분에서도 마찬가지로 사용된다 (예 : 더 안전한 숫자 생성기 기타). 내 질문은 여기 TLS 용으로 구성된 서버와 SSLv3으로 SSLContext를 초기화하는 클라이언트 구현간에 협상이 실패하는 이유가 무엇입니까? – Cratylus

관련 문제