Como devo fazer a validação do nome do host ao usar o JSSE?

Eu estou escrevendo um cliente em Java (precisa trabalhar tanto no desktop JRE e no Android) para um protocolo proprietário (específico para a minha empresa) realizado por TLS. Eu estou tentando descobrir a melhor maneira de escrever um cliente TLS em Java e, em particular, certifique-se de que ele faz a validação de nome de host corretamente. (Editar: Por que, quero dizer, verificar se o nome do host corresponde ao certificado X.509, para evitar ataques do tipo man-in-the-middle.)

JSSE é a API óbvia para escrever um cliente TLS, mas notei a partir do "Código mais perigoso do mundo"papel (bem como da experimentação) que o JSSE não valida o nome do host quando um está usando a API SSLSocketFactory (que é o que eu tenho que usar, desde que meu protocolo não é HTTPS.)

Então, parece que ao usar o JSSE, eu tenho que fazer a validação do hostname eu mesmo. E, em vez de escrever esse código a partir do zero (já que eu certamente iria errar), parece que eu deveria "pegar emprestado" algum código existente que funciona. Então, o candidato mais provável que eu encontrei é usar a biblioteca Apache HttpComponents (irônico, já que eu não estou realmente fazendo HTTP)e use a classe org.apache.http.conn.ssl.SSLSocketFactory no lugar da classe padrão javax.net.ssl.SSLSocketFactory.

Minha pergunta é: esse é um curso razoável de ação? Ou eu realmente entendi mal as coisas, acabei indo muito fundo, e há realmente uma maneira muito mais fácil de obter a validação do nome do host no JSSE, sem precisar usar uma biblioteca de terceiros como o HttpComponents?

Eu também olhei para o BouncyCastle, que tem uma API não-JSSE para TLS, mas parece ser ainda mais limitado, pois ele nem sequer faz validação de cadeia de certificados, muito menos validação de nome de host, então parecia um não -iniciante.

Editar: Essa questãofoi respondido para o Java 7, mas ainda estou curioso para saber qual é a "melhor prática" para o Java 6 e o ​​Android. (Em particular, eu tenho que suportar o Android para o meu aplicativo.)

Editado novamente: Para tornar minha proposta de "emprestar do Apache HttpComponents" mais concreta, eu criei umpequena biblioteca que contém as implementações HostnameVerifier (mais notavelmente StrictHostnameVerifier e BrowserCompatHostnameVerifier) ​​extraídas do Apache HttpComponents. (Eu percebi que tudo que eu preciso são os verificadores, e eu não preciso do SSLSocketFactory do Apache como eu estava pensando originalmente.) Se for deixado para os meus próprios dispositivos, esta é a solução que vou usar. Mas em primeiro lugar, há alguma razão pela qual eunão deveria faz assim? (Assumindo que meu objetivo é fazer a validação do meu nome de host da mesma forma que o https. Percebo que ele próprio está aberto para debate e foi discutido no tópico da lista de criptografia, mas por enquanto estou mantendo um nome de host semelhante a HTTPS validação, mesmo que eu não esteja fazendo HTTPS.)

Assumindo que não há nada "errado" com a minha solução, minha pergunta é a seguinte: existe uma maneira "melhor" de fazê-lo, mantendo-se ainda portátil em Java 6, Java 7 e Android? (Onde "melhor" significa mais idiomático, já amplamente em uso e / ou precisando de menos código externo.)

questionAnswers(2)

yourAnswerToTheQuestion