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