Открытие SSL-соединения через веб-браузер в библиотеке HtmlUnit - PullRequest
4 голосов
/ 15 июля 2011

Я искал в интернете пару часов по этому вопросу, и ни один из найденных ответов на самом деле не вписывался в мою проблему, так что вот я, задаю свой первый в истории вопрос в SOF.

Итак, я пытаюсь открыть веб-браузер из Java-программы, используя библиотеку htmlunit.Веб-сайт, который мне нужно подключить, требует SSL-соединения, а сертификат хранится на USB-ключе.Это продукт iKey2023.

Система работала (я ее не писал), но срок действия одного из сертификатов в USB-ключе истек, поэтому он автоматически перешел к следующему (всего было 4 сертификата)), и он внезапно перестал работать.

Это дает мне javax.net.ssl.SSLPeerUnverifiedException: ошибка peer not authenticated.

Я вернулся домой и забыл точное имяметод, но я помню следующее.

  1. Экземпляр браузера создан с использованием IE8

  2. browser.setWebConnection метод был вызван.Этот метод, согласно API, является внутренним API.

  3. Установите соединение с веб-сайтом, передав URL-адрес в качестве параметра

Он выбрасываетисключение на шаге 3.

Еще несколько подробностей.Маленькие детали могут быть неверными, но я пытаюсь описать большую картину.На шаге 2 метод запрашивает объект WebConnection в качестве параметра, и существует реализация этого интерфейса.В этой реализации хранилище ключей создается с использованием sun.security.pkcs11.SunPKCS11 (configFileInputStream) (правильно ли я это написал?)

Это было так:

Поставщик p = новое солнце.security.pkcs11.SunPKCS11 (configFileInputStream);Security.addProvider (p);

И создайте хранилище ключей из этого провайдера.

Используя это хранилище ключей, в реализации WebConnection он создает SSLSocket.

Итак, послесертификат был переключен на новый, он не получает сертификат правильно.

Вот что я пробовал.

  1. Я пытался использовать разныеметоды в библиотеке htmlunit, что-то вроде setSecurityProvider, и я попытался поместить объект Provider, созданный в приведенном выше фрагменте кода.Я получил исключение приведения класса.

  2. Я попытался вручную установить системные свойства (trustStore, trustStorePassword, keyStore и т. Д.).Чтобы сделать это, я хотел экспортировать сертификат из USB-ключа, но он не позволил мне экспортировать из него закрытый ключ, поэтому я не мог реально создать из него действительный файл PKCS12 (openSSL хотел приватныйфайл ключа вместе с файлом .pem для конвертации, и у меня не было этого файла ключа).

Они не работали, и я сейчас застрял.

1 Ответ

5 голосов
/ 03 января 2012

У меня похожая проблема. В моем случае администратор изменил сертификат, и я начал сталкиваться с той же исключительной ситуацией SSLPeerUnverifiedException.

Я обнаружил, что могу настроить WebClient на использование insecureSSL (до вызова getPage ()) и больше не получу исключение.

webClient.setUseInsecureSSL(true);

Это, однако, не решает проблему, поскольку сервер в основном не аутентифицирует клиента.

Как будто WebClient хранит что-то, что не работает с новым сертификатом.

...