2011-06-17 16 views
6

Cuando ejecuto el siguiente código, ¿por qué es el primer handshake SSLv2, no TLSv1 o SSLv3?cómo usar TLSV1 o SSLV3 para el primer apretón de manos (Cliente Hola) en Java?

¿Cómo usar TLSV1 o SSLV3 para el primer saludo de manos en Java?

String host = "www.google.com"; 
String url = "/adsense/?sourceid=aso&subid=ZH_CN-ET-AS-ADSBY6&medium=link&hl=zh_CN"; 
SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); 
SSLContext.setDefault(ctx); 
SSLSocketFactory factory = ctx.getSocketFactory(); 
Socket socket = factory.createSocket(host, 443); 
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
out.write("GET " + url + " HTTP/1.0"); 
out.flush(); 
out.close(); 
in.close(); 
+0

Compruebe https://blogs.oracle.com/java-platform-group/entry/diagnosing_tls_ssl_and_https – user454322

+0

Tenga en cuenta que [en realidad no era un SSLv2 de todos modos] (http://stackoverflow.com/a/4686924/372643), solo un SSLv3 (o superior) encapsulado en un SSLv2. – Bruno

Respuesta

8

Uso SSLSocket:

SSLSocket socket = factory.createSocket(host, 443); 
String[] newProtocols = {"TLSv1"}; 
socket.setEnabledProtocols(newProtocols); 
+0

gracias, esta solución es mejor, ya que no afecta a otras conexiones. – jatanp

17

Para TLSv1: Inicio de la JVM de cliente con

-Dhttps.protocols="TLSv1" 

o el uso de

System.setProperty("https.protocols", "TLSv1"); 

resuelto el problema para mí.

+0

El argumento '-Dhttps.protocols' funcionó muy bien para mí en algún viejo software de caja negra patentado que no pude cambiar. –

0

¿Qué versión de java estás usando? Además, ¿cómo se dice que usa SSLv2? Por defecto, java 1.6 usará TLSv1. Hay una trampa aquí, si habilita la depuración de ssl, puede ver el formato SSLv2Hello en uso, pero si lo cierra, la 'vesion de protocolo' dentro de la capa de grabación será TLSv1 (envoltorio de información de versión 1.e en formato SSLv2). El análisis de captura de paquetes a nivel TCP usando wireshark debería confirmar esto. Si desea iniciar en formato TLSv1, solo configure https.protocols = TLSv1 (esto podría afectar a todas las llamadas salientes de SSL) O configure ese socket específico como se indicó anteriormente. Tenga en cuenta que incluso si tiene cinco listas separadas por comas (como https.protocols = SSLv3, TLSv1), comenzará con TLSv1.

Cuestiones relacionadas