Почему я получаю ошибку рукопожатия (Java SSL) - PullRequest
9 голосов
/ 12 февраля 2012

Я подключаюсь к веб-сервису через HTTPS.Я сделал все, что, по моему мнению, необходимо, чтобы это работало, но в итоге я получаю ошибку рукопожатия.

Я обнаружил, что как новый пользователь я не могу опубликовать более 2 ссылок из-за"защита от спама" - большое спасибо stackoverflow ... в любом случае вот ссылка на публикацию вставки со всеми указанными ссылками ... поэтому, когда я пишу "link # 1" здесь, это ссылка на эти ссылки: http://pastebin.com/y4zGNRC7

  • Я проверил то же поведение, используя HttpClient (GET на URL-адресе службы) и фактически вызывая веб-службу через прокси-сервер CXF
  • Я устанавливаю хранилище ключей и хранилище доверенных сертификатов - я пыталсякак в коде (ссылка # 1), так и в настройке системных свойств - т.е. System.setProperty ("javax.net.ssl.keyStore", "mykeystore.jks");
  • Отладка SSL включена(javax.net.debug = all)
  • Отладка SSL стирает содержимое как хранилища ключей, так и хранилища доверенных сертификатов (т. е. похоже, что Java "знает о них") - ссылка № 2
  • выглядит так, как будто естьпроисходит некоторое взаимодействие клиент-сервер, но затем происходит сбойeason link # 3
  • Я успешно подключился к серверу, используя клиентские сертификаты и сертификаты CA как в браузере (Chrome), так и с использованием openssl s_client
  • wireshark показывает меньше разговоров клиент-сервер из java (ссылка# 4) затем, например, из Chrome (ссылка № 5)

Еще одна странная вещь заключается в том, что у меня, похоже, такое же поведение, когда я устанавливаю хранилище ключей, а когда нет(единственное отличие состоит в том, что когда я делаю содержимое хранилища ключей, выводится на консоль, но это все).

Я попытался найти проблему в поиске и увидел множество похожих сообщений здесь на stackoverflow, но ничего не помогло,Я попытался изменить версию протокола («TLSv1», «SSLv3», даже странный v2 Hello).Буду признателен за любую помощь - может быть, есть кое-что фундаментальное, что я мог бы упустить из виду ... Я впадаю в отчаяние ... Спасибо

PS Я работаю с Java 30 Update 30 на Fedora Core 15 (64-битная версия)

Ответы [ 3 ]

4 голосов
/ 15 февраля 2012

Проблема заключалась в том, что, хотя хранилище ключей и хранилище доверенных сертификатов были установлены, java решила не отправлять сертификат клиента на сервер. Причиной этого был тот факт, что сервер запросил сертификат, подписанный органом RootCA, но сертификат клиента подписан органом SubCA (который выдается RootCA).

Первоначально хранилище ключей содержало только сертификат клиента и доверенное хранилище сертификат SubCA. Затем я попытался добавить сертификат SubCA в хранилище ключей, но java просто проигнорировал его.

Так что это решает тайну сбоя hanshake, но не мою проблему.

Я создал отдельный вопрос для этого ... вздох :-( почему java не отправляет сертификат клиента во время SSL-рукопожатия?

2 голосов
/ 13 февраля 2012

Я думаю, что хранилище доверия, не содержащее CA, является наиболее вероятной проблемой.Вы можете использовать Java keytool, чтобы импортировать сертификат для сайта в файл cacerts, выполнив что-то вроде:

keytool -keystore pathtocacerts -import -trustcacerts -v -alias aliasName -file root.crt

Пароль хранилища ключей cacerts по умолчанию - changeit.Файл cacerts обычно находится в каталоге jre/lib/security.

2 голосов
/ 12 февраля 2012

Вы не предоставляете достаточно информации, но я предполагаю, что ваш клиент хранилище доверенных сертификатов не настроен должным образом.Склад доверенных сертификатов содержит доверенные сертификаты, которые используются для подписи других сертификатов, и должен включать корневые сертификаты для цепочек сертификатов сервера и клиента.Клиентское хранилище ключей содержит клиентский SSL-сертификат и закрытый ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...