Цепочка сертификатов отличается между HTTPSURLconnection и Apache (System) DefaultHttpClient

У меня возникла странная проблема с клиентом Apache HTTPS. Я пытаюсь подключиться к внешнему веб-сайту HTTPS, на котором включена базовая аутентификация (только аутентификация сервера SSL). Вот краткое изложение моих тестов и выводов.

  • Используйте любой из Chrome/Firefox/IE для подключения к веб-сайту -> успех

  • Используйте javax.net.ssl.HttpsURLConnection -> успех

  • Используйте либо DefaultHttpClient, либо SystemDefaultHttpClient -> отказ

Я попытался отладить, включив «javax.net.debug» для «ssl». Я заметил, что оба клиента выбирают одно и то же хранилище доверия (хранилище доверия JDK по умолчанию) и используют один и тот же протокол (TLSv1). Однако здесь были отличия

Я заметил, что следующее расширение было возвращено JDK

Имя_сервера расширения, имя_сервера: [имя_хоста: имя_хоста_сайта]

в то время как вышеуказанное расширение отсутствовало в журнале отладки веб-клиента Apache.

Кроме того, еще одно отличие, которое я увидел, было в цепочке сертификатов.

Приведенный ниже ответ от родного JDK

* Цепочка цепочек сертификатов [0] = [ [ Версия: V3 Тема: **CN=имя веб-сайта, OU=Подтвержден контроль домена — RapidSSL(R), OU=См. www.rapidssl.com/resources/ cps (c)13, OU=GT17702541, SERIALNUMBER=Q2La1fpFlFdNy4kUCIehYlMvw6bq64Ch Алгоритм подписи: SHA1withRSA, OID = 1.2.840.113549.1.1.5

в то время как в клиенте apache следующее

chain [0] = [ [ Версия: V3 Тема: EMAILADDRESS=root@i4319, CN=i4319, OU=SomeOrganizationalUnit, O=SomeOrganization, L=SomeCity, ST=SomeState, C=-- Подпись Алгоритм: SHA1 с RSA, OID = 1.2.840.113549.1.1.5

и, очевидно, я получаю следующее исключение с клиентом apache https.

Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

Прежде чем я вернусь и переделаю свою работу, чтобы использовать собственный клиент JDK, я хотел бы знать, что происходит. Любое понимание этого поведения будет оценено.


person javadeveloper    schedule 31.07.2013    source источник
comment
На самом деле я понятия не имею (основной HTTP-клиент Apache SSLSocketFactory в конечном итоге совпадает с тем, что JDK использует для HTTPSURLConnection), но первое, что приходит на ум, это настройки прокси, вы должны включить проводную отладку и проверить, работает ли один клиент. или другой проходит через один ... Прокси хорошо генерируют поддельные сертификаты, когда они выполняют фильтрацию SSL.   -  person GPI    schedule 31.07.2013
comment
Если вы про прокси в моей сети, то должен сказать, что я его никогда не настраивал (в браузере, например).   -  person javadeveloper    schedule 01.08.2013


Ответы (1)


После долгих поисков эта странная проблема возникла из-за отсутствия поддержки SNI в клиенте Apache. Вот JIRA, в которой обсуждается проблема и возможное решение здесь

https://issues.apache.org/jira/browse/HTTPCLIENT-1119

и возможная работа здесь

https://wiki.apache.org/HttpComponents/SNISupport

person javadeveloper    schedule 01.08.2013