¿Cómo debo hacer la validación del nombre de host cuando uso JSSE?

Estoy escribiendo un cliente en Java (se necesita trabajar tanto en el JRE de escritorio como en Android) para un protocolo propietario (específico para mi empresa) que se transmite a través de TLS. Estoy tratando de descubrir la mejor manera de escribir un cliente TLS en Java, y en particular, asegurarme de que haga la validación del nombre de host correctamente. (Editar: Con lo cual, me refiero a verificar que el nombre de host coincida con el certificado X.509, para evitar ataques de intermediario.)

JSSE es la API obvia para escribir un cliente TLS, pero me di cuenta de que "El código más peligroso del mundo"en papel (así como a partir de la experimentación) que JSSE no valida el nombre de host cuando uno está usando la API SSLSocketFactory (que es lo que tengo que usar, ya que mi protocolo no es HTTPS).

Entonces, parece que cuando uso JSSE, tengo que hacer la validación del nombre de host. Y, en lugar de escribir ese código desde cero (ya que casi con toda seguridad me equivoco), parece que debería "pedir prestado" un código existente que funcione. Entonces, el candidato más probable que he encontrado es usar la biblioteca Apache HttpComponents (irónico, ya que no estoy haciendo HTTP)y use la clase org.apache.http.conn.ssl.SSLSocketFactory en lugar de la clase estándar javax.net.ssl.SSLSocketFactory.

Mi pregunta es: ¿es este un curso de acción razonable? ¿O me he malinterpretado por completo las cosas, me he salido del extremo profundo y en realidad hay una forma mucho más fácil de obtener la validación del nombre de host en JSSE, sin tener que acceder a una biblioteca de terceros como HttpComponents?

También busqué en BouncyCastle, que tiene una API no JSSE para TLS, pero parece ser aún más limitado, ya que ni siquiera hace la validación de la cadena de certificados, y mucho menos la validación del nombre de host, por lo que no parecía -motor de arranque.

Editar: Esta preguntaha sido respondido para Java 7, pero sigo sintiendo curiosidad por saber cuál es la "mejor práctica" para Java 6 y Android. (En particular, tengo que ser compatible con Android para mi aplicación.)

Editado de nuevo: Para hacer más concreta mi propuesta de "tomar prestado de Apache HttpComponents", he creado unpequeña biblioteca que contiene las implementaciones de HostnameVerifier (especialmente StrictHostnameVerifier y BrowserCompatHostnameVerifier) ​​extraídas de Apache HttpComponents. (Me di cuenta de que todo lo que necesito son los verificadores, y no necesito el SSLSocketFactory de Apache como lo pensaba originalmente). Si lo dejé para mis propios dispositivos, esta es la solución que usaré. Pero en primer lugar, ¿hay alguna razón por la queno debería ¿hacerlo de esta forma? (Suponiendo que mi objetivo es hacer la validación de mi nombre de host de la misma manera que lo hace https. Me doy cuenta de que está abierto a debate, y se ha discutido en el hilo de la lista de criptografía, pero por ahora me quedo con el nombre de host similar a HTTPS validación, aunque no estoy haciendo HTTPS.)

Suponiendo que no hay nada "incorrecto" con mi solución, mi pregunta es la siguiente: ¿existe una "mejor" forma de hacerlo, mientras aún permanezca portátil en Java 6, Java 7 y Android? (Donde "mejor" significa más idiomático, ya se usa ampliamente y / o necesita menos código externo).

Respuestas a la pregunta(2)

Su respuesta a la pregunta