Foros del Web » Programación para mayores de 30 ;) » Java »

Petición ssl funciona en windows error en unix

Estas en el tema de Petición ssl funciona en windows error en unix en el foro de Java en Foros del Web. Buenas días, El método siguiente se encarga de realizar una petición ssl a una web que devuelve una cadena con parámetros para utilizar su API, ...
  #1 (permalink)  
Antiguo 01/04/2013, 03:58
 
Fecha de Ingreso: abril-2013
Mensajes: 2
Antigüedad: 11 años, 1 mes
Puntos: 0
Pregunta Petición ssl funciona en windows error en unix

Buenas días,

El método siguiente se encarga de realizar una petición ssl a una web que devuelve una cadena con parámetros para utilizar su API, se conecta a la web, envía la cabecera correcta de la petición POST y a continuación los parámetros de usuario y contraseña, después lee la respuesta y la devuelve.

El problema es que el método funciona correctamente en windows pero al ejecutarlo en ubuntu o mac no se obtiene ninguna respuesta.

Incluso he probado a realizar la petición por telnet en ubuntu de la siguiente manera:

telnet sitio.com 443

POST /user/login?client_id=xxx HTTP/1.1
Host: sitio.com
Content-type: application/x-www-form-urlencoded
Content-length: 33
Accept: application/json, text/javascript, */*; q=0.01

user=usuario&password=contrasena

y en vez de recibir la cadena esperada obtengo la respuesta :

Connection closed by foreign host.


Y el código del método sería similar a este:

Código:
public static String SSLSocketCliente(){
		String stRespuesta = "";
	     try {
	          Security.addProvider ( new com.sun.net.ssl. internal .ssl.Provider());
	          SSLSocketFactory factory =
	              (SSLSocketFactory)SSLSocketFactory.getDefault();
	          SSLSocket socket =
	              (SSLSocket)factory.createSocket( "sitio.com" , 443 );
	          /*
	           * send http request
	           *
	           * Before any application data is sent or received, the
	           * SSL socket will do SSL handshaking first to set up
	           * the security attributes.
	           *
	           * SSL handshaking can be initiated by either flushing data
	           * down the pipe, or by starting the handshaking by hand.
	           *
	           * Handshaking is started manually in this example because
	           * PrintWriter catches all IOExceptions (including
	           * SSLExceptions), sets an internal error flag, and then
	           * returns without rethrowing the exception.
	           *
	           * Unfortunately, this means any error messages are lost,
	           * which caused lots of confusion for others using this
	           * code.   The only way to tell there was an error is to call
	           * PrintWriter.checkError().
	           */
	          socket.startHandshake();
	          PrintWriter out = new PrintWriter( new BufferedWriter(
	          new OutputStreamWriter(socket.getOutputStream())));
	          
	          out .println( "POST /urlPeticion/user/login?client_id=xxxx HTTP/1.1" );
	          out .println( "Host: sitio.com" );
	          out .println( "Content-type: application/x-www-form-urlencoded" );
	          out .println( "Content-length: "+"user=usuario&password=contraseña".length());
	          out .println( "Accept: application/json, text/javascript, */*; q=0.01" );
	          out .println();
	          out .println( "user=usuario&password=contaseña" );
	          out .println();
	          out .flush();
	          /*
	           * Make sure there were no surprises
	           */
	          if ( out .checkError())
	              System. out .println( "SSLSocketClient:   java.io.PrintWriter error" );
	          /* read response */
	          BufferedReader in = new BufferedReader(
	              new InputStreamReader(socket.getInputStream()));
	          String inputLine;
	          while ((inputLine = in.readLine()) != null ){
	              System.out.println(inputLine);
	          	  stRespuesta += inputLine;
	          }
	          in.close();
	          out.close();
	          socket.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }      
	        return stRespuesta;
	}

Alguna idea de porque funciona en windows únicamente?, el proyecto es el mismo en todas las plataformas sincronizado por svn y además también he probado a copiar el proyecto completo directamente
  #2 (permalink)  
Antiguo 01/04/2013, 04:45
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Petición ssl funciona en windows error en unix

Hola:

No puedo asegurar nada, pero se me ocurren varias cosas.

Lo de com.sun.net.ssl.internal.ssl.Provider tiene pinta de ser una clase específica del JDK de Sun. Si no estás usando ese JDK en ubuntu o mac (ubuntu viene por defecto con OpenJDK y Mac viene con su propia versión de java) es posible que esa clase no exista. Si es eso, debería darte un error al compilar o al hacer el new si te has llevado el programa ya compilado desde windows.

Por otro lado, el certificado del servidor al que intentas acceder (sitio.com), debe estar entre tus certificados de confianza. Eso se suele hacer con el comando

keytool -importcert -alias servidor1 -keystore .keystore -file servidor1.cer

donde servidor1.cer es el certificado del servidor que te puedes bajar con un navegador (ver certificado y salvarlo). El comando anterior lo mete en un fichero .keystore, pero la ubicación por defecto suele ser <java-home>/lib/security/cacerts

Aquí tienes algo más del tema http://chuwiki.chuidiang.org/index.p...tps_desde_java

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 01/04/2013, 06:35
 
Fecha de Ingreso: abril-2013
Mensajes: 2
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Petición ssl funciona en windows error en unix

He revisado el código y creado un nuevo proyecto únicamente con el método anterior y ahora si me avisaba de el error de com.sun.net.ssl.internal.ssl.Provider ya que lo buscaba en openjdk y no lo podía encontrar, así que he desinstalado el openjdk e instalado el jdk de sun, después de esto el error desaparece pero aun así sigue sin devolver nada en ubuntu, también he probado a descargar el certificado desde firefox (un archivo .crt) y lo he añadido con el comando mencionado pero así tampoco consigo recibir ninguna respuesta en el metodo.
¿Alguna sugerencia mas?

Un saludo y gracias.
  #4 (permalink)  
Antiguo 01/04/2013, 06:50
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Petición ssl funciona en windows error en unix

En vez de leer con readLine() prueba a leer bytes sin más. El readLine espera un retorno de carro y puede haber problemas entre linux/windows, ya que en uno es \n y en el otro es \r\n

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Etiquetas: post, sockets, ssl, unix, windows
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:19.