Как мне сделать проверку имени хоста при использовании JSSE?

Я пишу клиент на Java (должен работать как на настольном JRE, так и на Android) для проприетарного протокола (специфичного для моей компании), передаваемого по TLS. Я'Я пытаюсь выяснить, как лучше написать клиент TLS на Java, и, в частности, убедиться, что он правильно выполняет проверку имени хоста. (Редактировать: Под этим я подразумеваю проверку соответствия имени хоста сертификату X.509, чтобы избежать атак "человек посередине".)

JSSE является очевидным API для написания TLS-клиента, но я заметил изСамый опасный кодекс в мире " документ (а также из экспериментов), что JSSE не '• проверять имя хоста, когда используется API-интерфейс SSLSocketFactory. (Это то, что я должен использовать, так как мой протокол не HTTPS.)

Итак, похоже, что при использовании JSSE я должен сам выполнить проверку имени хоста. И вместо того, чтобы писать этот код с нуля (поскольку я почти наверняка понял бы его неправильно), мне кажется, что я должен "одолжить" некоторый существующий код, который работает. Итак, наиболее вероятный кандидат, ямы обнаружили, что использовать библиотеку Apache HttpComponents (иронично, так как яя на самом деле не делаю HTTP)и используйте класс org.apache.http.conn.ssl.SSLSocketFactory вместо стандартного класса javax.net.ssl.SSLSocketFactory.

Мой вопрос: это разумный курс действий? Или я совершенно неправильно понял вещи, ушел из глубокого конца, и тамна самом деле гораздо более простой способ проверки имени хоста в JSSE, без использования сторонней библиотеки, такой как HttpComponents?

Я также посмотрел на BouncyCastle, который имеет не-JSSE API для TLS, но кажется, что он еще более ограничен в том смысле, чтоЯ даже не проверил цепочку сертификатов, а тем более проверку имени хоста, так что это было похоже на стартер.

Редактировать: Этот вопросбыл дан ответ для Java 7, но яМне все еще интересно, что за "лучшая практика » для Java 6 и Android. (В частности, я должен поддерживать Android для моего приложения.)

Отредактировано снова: Чтобы сделать мое предложение "позаимствовать у Apache HttpComponents более конкретно ямы создалинебольшая библиотека который содержит реализации HostnameVerifier (прежде всего StrictHostnameVerifier и BrowserCompatHostnameVerifier), извлеченные из Apache HttpComponents. (Я понял, что все, что мне нужно, это проверщики, и я нене нужен Apache 's SSLSocketFactory, как я изначально думал. Если я оставлю это на усмотрение моих устройств, то это решение, которое я буду использовать. Но, во-первых, есть ли причина, по которой яне должен сделать это так? (Предполагая, что моя цель состоит в том, чтобы сделать мою проверку имени хоста таким же образом, как это делает https. Я понимаю, что сама по себе открыта для обсуждения и обсуждалась в теме в списке криптографии, но сейчас я 'я придерживаюсь HTTPS-подобной проверки имени хоста, хотя яя не делаю HTTPS.)

Предполагая, что тамничегонеправильно" с моим решением, мой вопрос заключается в следующем: есть ли "лучше" способ сделать это, оставаясь при этом переносимым на Java 6, Java 7 и Android? (Куда "лучше" означает более идиоматичный, уже широко используемый и / или требующий меньше внешнего кода.)

Ответы на вопрос(2)

Ваш ответ на вопрос