2009-12-21 3 views
2

SSL을 사용하여 C 서버와 통신하도록 Java 클라이언트를 가져 오려고합니다.SSLSockets 및 Cipher Specs 관련 문제

문제는 - 내가 어떤 서버 소스가없는 나는 악수 실패 오류 받고 있어요 : 작업 C 클라이언트 (나는 '돈 것을, 내가 지금 알고있는 몇 가지 무거운 의무 wiresharking 후

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1657) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:932) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107) 
     at posslu.Main.main(Main.java:36) 
Java Result: 1 

을 t)는도 자신의 소스 코드에 액세스 할 수있는 클라이언트 - 서버 헬로 패킷이 암호화 사양이 있습니다

Cipher Spec: SSL2_DES_192_EDE3_CBC_WITH_MD5 (0x0700c0) 
Cipher Spec: SSL2_IDEA_128_CBC_WITH_MD5 (0x050080) 
Cipher Spec: SSL2_RC2_CBC_128_CBC_WITH_MD5 (0x030080) 
Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080) 
Cipher Spec: SSL2_RC4_64_WITH_MD5 (0x080080) 
Cipher Spec: SSL2_DES_64_CBC_WITH_MD5 (0x060040) 
Cipher Spec: SSL2_RC2_CBC_128_CBC_WITH_MD5 (0x040080) 
Cipher Spec: SSL2_RC4_128_EXPORT40_WITH_MD5 (0x020080) 

을 모든 패킷은 SSLv2의 프로토콜에 전송됩니다.

그리고 이러한 SSLSocket.getSupportedCipherSuites의 사양입니다() 메소드 :

SSL_RSA_WITH_RC4_128_MD5 
SSL_RSA_WITH_RC4_128_SHA 
TLS_RSA_WITH_AES_128_CBC_SHA 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA 
TLS_DHE_DSS_WITH_AES_128_CBC_SHA 
SSL_RSA_WITH_3DES_EDE_CBC_SHA 
SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA 
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA 
SSL_RSA_WITH_DES_CBC_SHA 
SSL_DHE_RSA_WITH_DES_CBC_SHA 
SSL_DHE_DSS_WITH_DES_CBC_SHA 
SSL_RSA_EXPORT_WITH_RC4_40_MD5 
SSL_RSA_EXPORT_WITH_DES40_CBC_SHA 
SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 
SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA 
SSL_RSA_WITH_NULL_MD5 
SSL_RSA_WITH_NULL_SHA 
SSL_DH_anon_WITH_RC4_128_MD5 
TLS_DH_anon_WITH_AES_128_CBC_SHA 
SSL_DH_anon_WITH_3DES_EDE_CBC_SHA 
SSL_DH_anon_WITH_DES_CBC_SHA 
SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 
SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA 
TLS_KRB5_WITH_RC4_128_SHA 
TLS_KRB5_WITH_RC4_128_MD5 
TLS_KRB5_WITH_3DES_EDE_CBC_SHA 
TLS_KRB5_WITH_3DES_EDE_CBC_MD5 
TLS_KRB5_WITH_DES_CBC_SHA 
TLS_KRB5_WITH_DES_CBC_MD5 
TLS_KRB5_EXPORT_WITH_RC4_40_SHA 
TLS_KRB5_EXPORT_WITH_RC4_40_MD5 
TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA 
TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 

지금 나는 C 서버에서 모두 지원됩니다 보인다

Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080) 

를 사용하려면 내 자바 클라이언트 .

SSLSocketFactory sslsockfact = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
SSLSocket sslsocket = (SSLSocket) sslsockfact.createSocket(args[0], args[1]); 

sslsocket.setEnabledCipherSuites(new String[] { "SSL_RSA_WITH_RC4_128_MD5" }); 
sslsocket.startHandshake(); 

그러나이 Cipher 스펙이 클라이언트에 전송되는 어떤 이유로

헬로 패킷이 :
Cipher Spec: TLS_RSA_WITH_RC4_128_MD5 (0x000004) 
Cipher Spec: SSL2_RC4_128_WITH_MD5 (0x010080) 

거기에만 두 번째는 포함되지해야

그래서 나는이 코드를 함께했다? 이렇게하면 서버가 TLSv1 프로토콜로 server-hello 패킷을 보내고 핸드 셰이크 오류가 발생합니다. 내가 getSupportedProtocols 메소드()에서 가져온

이 지원되는 프로토콜 :

sslsocket.setEnabledProtocols(new String[] { "SSLv2Hello" }); 
:

SSLv2Hello 
SSLv3 
TLSv1 

을 내 코드에서 이런 식으로 뭔가를 넣으면

나는 무슨 일이 일어나고 있는지 알아 내려고 갔다

말합니다 :

Exception in thread "main" java.lang.IllegalArgumentException: SSLv2Hellocannot be enabled unless TLSv1 or SSLv3 is also enabled 

내가로 전환하면 ... SSLv3에에

sslsocket.setEnabledProtocols(new String[] { "SSLv2Hello", "SSLv3" }); 

서버 응답 및 I 핸드 셰이크 실패를 얻을

그래서 내가 어떻게이 작동하도록하는 어떤 도움을 아무 생각이 다야?

SSLv2가 더 이상 지원되지 않으며 단순히 Java에서 사용할 수 없습니까?

답변

1

JDK JSSE 공급자는 본질적으로 안전하지 않은 프로토콜 인 SSL v2를 지원하지 않습니다. SSLv2Hello 지원은 프로토콜 버그가있을 수 있고 v2 hello가 필요한 일부 서버의 SSLv3과의 호환성을위한 것입니다. 이 SSLv2Hello는 JDK7에서 제거되었습니다.

실제 대화의 경우 SSLv3 및 TLS 만 지원됩니다. 따라서 서버가 SSL v2 만 지원하는 경우 서버 업그레이드가 필요합니다. v2는 안전하지 않으므로 사용하지 않아야합니다. SSL_RSA_WITH_RC4_128_MD5TLS_RSA_WITH_RC4_128_MD5은 동일한 암호 제품군이지만 SSLSocketFactory.getSupportedCipherSuites()을 통해 지원되는 스위트 세트를 요청하면 HotSpot JSSE는 전자만을보고합니다. 현재 Wireshark 프로토콜 분석기는 혼동을 야기 할 수있는 TLS_RSA_WITH_RC4_128_MD5 (0x0004)을보고합니다.

은 참조 :

How to initiate ssl connection using SSLv2 http://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html

편집 : 그 SSLv2를 위에 언급하기 때문에 매우 사용되지 않으며 불안, 나는 나 또한 지금 SSLv3 POODLE exploit 때문에, SSLv3에 게시 된 언급해야한다고 생각한다 또한 안전하지 않으며 비추천으로 간주됩니다.