SSLPeerUnverifiedException and debugging SSL connections

I’ve faced the problem of having to deal with a strange exception seen in our application log:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

See full trace in a pastebin.

Looking about this you can find lots of things. Some are a bit mi leading and others give good grasp about what’s happening.

The context here is, we have an edge API that uses other internal API for random access data. We could see this problem for some of the requests (so it was not due a self-signed certificate or anything related). I’m attempting to share my experience of what has happening at the end.

Catching the exception

I started by catching the exception and trying to provide a bit more information about the requests that were producing the exception. I could not find any pattern about the type of requests.

Connection timeout?

One of our sysadmins pointed out that the problem could be generated by the socket timing out during the SSL handshake, as it’s pointed out in the following JIRA ticket: https://issues.apache.org/jira/browse/HTTPCLIENT-1070

While this could be the cause of the problem, we wanted to make sure that this was the case.

Analysing SSL errors

The “How to Analyse Java SSL Errors” post from dzone.com give me a good light about how to proceed. So I turned on the SSL debugging information by adding the following parameter when starting the server and try to find the problem:

-Djavax.net.debug=ssl:handshake

This is what I found:

qtp978883631-84, WRITE: TLSv1 Alert, length = 2
qtp978883631-91, WRITE: TLSv1 Handshake, length = 48
qtp978883631-84, called closeSocket()
qtp978883631-84, IOException in getSession():
    java.net.SocketTimeoutException: Read timed out
qtp978883631-84, called close()
qtp978883631-84, called closeInternal(true)

This is a great indicator that as our Systems guy was suggesting, connection is timing out during the SSL handshake.

At the end

The way I’ve tackled this issue is by silencing this kind of exceptions. We could have tried retrying the connection but we thought that the information provided by the second API is not as important and we will have the chance of trying again later in the following requests.

 

 

 

 

 

Llega Java 8

Que hay de nuevo en Java 8?

Ya llevo tiempo programando en Java y toca recopilar un poco de información para ver que incluye la nueva versión de Java 8.

Esta vez escribo en Español porqué en Inglés ya hay mucha literatura al respecto.

Expresiones Lambda

Es una nueva funcionalidad del lenguaje que nos permite incluir “funcionalidad” a los parámetros de los métodos. Es mas que el “sintactic sugar” (como dicen algunos), pues el compilador puede usar el contexto de la expresión para determinar la interfaz usada y resolver el tipo de los parámetros automaticamente.

Un ejemplo de la frase anterior es lo siguiente:

En vez de:

(String str) -> System.out.println(str)

Podemos hacer:

str -> System.out.println(str)

Metodos “default”

Nos permite añadir funcionalidades en las interfaces. Esto nos permite también añadir nuevos métodos a las interfaces sin romper todas las implementaciones actuales (backwards compatibility).

El comportamiento de este tipo de métodos es el que podemos intuir por su nombre: Cualquier clase que implementa una interfaz pero no sobre-escribe el método, va a adquirir la implementación por defecto.

Nueva colección “Stream”

La interfaz “stream” nos permite realizar operaciones en un estilo funcional sobre stream de elementos. Representa la secuencia de objetos, de un modo similar a un iterador, pero permite su ejecución en paralelo. Permite operaciones típicas como “map”, “reduce” o “filter”.

Un ejemplo de uso de los nuevos “Streams”:

List stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");
 
stringCollection
    .stream()
    .filter((s) -> s.startsWith("a"))
    .forEach(System.out::println);

Programación funcional

Java 8 trata de elevar las funciones en ciudadanos de primera dentro de la programación, justo como se trata en la programación funcional.

Por eso, se incluye la interfaz “Function”, el tipo de datos “Tuple” al mas puro estilo Scala, se añaden algunos tipos inmutable (DateTime, Streams o el Optional, así como ya lo son los String hoy en día).

Como ya hemos dicho, además de las expresiones, también incluyen nuevas interfaces que habilitan Java para un uso mas funcional. Un ejemplo de uso es el siguiente:

Function<String, String> atr = (name) -> {return "@" + name;};

Y como empezar?

Para terminar, podéis descargar Java Runtime Environment. Ahí tenéis un review con un botón al link para descargarlo.

Notícias de programación

Hace algun tiempo que no posteo y tenía guardado un par de temas sobre programación:

1. Concurso de programación JAVA => javaCup 2009

Pues no se como dí con este evento pero me pareció gracioso. Con una API que te puedes descargar desde la misma página del torneo tienes que programar la táctica de tu equipo y como se va a comportar dependiendo del minuto de juego en que se encuentre el partido y del resultado. Mi intención es participar, así que si alguien se anima que me avise, así podemos echar algún amistoso antes de mandar las clases que hayamos desarrollado al concurso.

La fecha límite para el envío de tu equipo es el 31 de mayo, así que manos a la obra.

2. ICPC World Finals 2009

Un colega (Albert Sánchez) me compartió en el Reader un post con unos comentarios sobre las finales del concurso de programación. Lo curioso ahí es que puedes encontrar los enunciados de la final del concurso [pdf] y una breve explicación de como ellos lo han resuelto. Hay alguno de los ejercicios que ya los he resuelto (a modo de pasatiempo) y són bastante divertidos.

Notas breves:

  • Brutal el partidazo del Barça contra el Chelsea. Brutal Valdes. ¡Brutal Iniesta, lo puto crack!
  • En el equipo donde jugué cuando estuve de erasmus había bastante gente del Chelsea. Ya me he encargado de dejarles un saludito en su wall del Facebook.
  • Gran campaña de as.com => 5 penaltis que no le han pitado al Barça
  • Esperando ver la nueva HTC Magic con Android. Si alguien quiere más información puede consultar opiniones de htc magic.
  • Se acerca el día de la boda. En breves tendremos las invitaciones. Hoy hemos comprado un colchón :) !
  • Tengo pendiente enlazar twitter con mi blog. El mensaje lo he puesto a mano …

JAVA Method: boolean isInteger()

Hoy tenía la necesidad de ver si un texto es un entero o no. He estado buscando un buen rato en google hasta que he dado con ella. Aquí os la dejo:

private static boolean isDouble(String str) {
        try {
                double v = Double.parseDouble(str);
                return true;
        } catch(NumberFormatException e) {
                return false;
        }
}
 
private static boolean isInteger(String str) {
        try {
                int v = Integer.parseInt(str);
                return true;
        } catch(NumberFormatException e) {
                return false;
        }
}

It works! :)