2017-02-23 60 views
0

Я пытаюсь использовать HtmlUnit войти на сайт, который использует соединение HTTPS и я получаю сообщение об ошибке вызвано заявлениемНевозможно подключиться с помощью HtmlUnit на сайт, используя HTTPS

page = webClient.getPage(url); 

Исключение составляет

error:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target` 

То, что я сделал до сих пор:

  • вывезенных отдельные сертификаты на веб-сайте» s цепочка сертификатов с помощью Firefox и импортировать их в хранилище ключей по умолчанию в JVM, используя Java-Keytool, например:

    keytool -import -trustcacerts -alias root -file C:\Users\myUser\Desktop\Certificates\VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt -keystore C:\Program Files (x86)\Java\jre1.8.0_91\lib\security\cacerts 
    
  • Начало нового хранилища ключей с помощью Java Keytool, и импортировать только соответствующий корень, промежуточный и конкретный веб-сайт сертификат.

  • Установить этот сертификат в хранилище сертификатов Java с использованием

    System.setProperty("javax.net.ssl.trustStore", "C:/Users/Henry/workspace/AutoEtime/cacerts"); 
    
  • попытался изменить версию браузера для Chrome, а затем Firefox
  • Пытались использовать SSLPoke.class из confluence.atlassian.com, чтобы проверить, если сертификаты были правильные, но я не знаю, порта для подключения, и использование по умолчанию 433 дает ConnectException: Connection timed out

Я не пробовал использовать любого из набросков других методов d в найденной документации WebClientOptionshere, потому что я не уверен, как использовать их для получения эффекта, который я хочу.

Одним из наиболее распространенных ответов, которые я видел в Интернете является предложение использовать webClient.setUseInsecureSSL(true);

Это прекрасно работает для тестирования моего приложения, однако мне нужно иметь соединение быть защищены с помощью SSL из-за чувствительности имя пользователя и пароли, которые я использую для подключения к веб-сайту.

Одна интересная вещь, которую я хочу добавить, заключается в том, что один из каждых 5-10 попыток фактически работает и не бросает исключение SSLHandshakeException, хотя я ничего не изменил в коде.

Как исправить эту проблему? Кроме того, почему он работает каждый раз в то время?

+0

Порт по умолчанию для HTTPS - 443, а не 433. Ручное изменение/запись файлов в Windows под '\ Program Files' или' \ Program Files (x86) '- плохая идея; для новых версий Windows такие изменения могут не работать или работать только иногда, что _might_ объясняет ваше прерывистое поведение.Либо установите Java в другом месте (мне нравится 'c: \ Java'), либо используйте вторую пулю: создайте собственное хранилище ключей и укажите на него; вам потребуется только корневой сертификат (ы), если сервер ведет себя корректно, и убедитесь, что перед началом использования SSL в процессе JVM установите 'trustStore' (AND' trustStorePassword', если не 'changeit'). –

+0

Возможно ли, что вы указали имя хоста, против которого вы пытаетесь? –

+0

Вы были правы, Дейв, я набрал порт в неправильном как в моем вопросе, так и в качестве аргумента при запуске SSLPoke.class. Как только я изменил его и добавил сертификаты, он успешно подключился. –

ответ

1

Хорошо, поэтому я понял это, просто попробовав разные вещи. Оказывается, мне нужно было импортировать сертификаты в .der, а не в .crt. У хранилища ключей по умолчанию уже был правильный корневой сертификат, но отсутствовала какая-то комбинация промежуточного и листового сертификата. После того, как я импортировал middle.der и leaf.der и указал, где моя копия файла cacerts была SSLHandshakeException, не повторилось. Надеюсь, это действительно зафиксировало это, и это исключение исчезло навсегда.

+0

Генри Махар Я не понимаю вашего ответа здесь. Что такое дер? Как вы их нашли? У нас аналогичная проблема. – user1567291