#java #web-services #ssl #wsit
#java #веб-службы #ssl #wsit
Вопрос:
Я пытаюсь добавить ссылку на веб-службу в свое приложение в NetBeans 7.0.1. Веб-служба Metro защищена SSL и размещена на том же компьютере, на котором я хочу запустить клиент. Я использую мастер создания клиента веб-службы, но когда я отправляю защищенный SSL WSDL, я получаю следующее сообщение об ошибке:
Проблема с загрузкой wsdl или файла схемы.
Проверьте URL-адрес, настройки прокси-сервера или работает ли сервер.
Руководство пользователя Metro — Для защиты примера состояния клиентского приложения веб-службы (SSL):
На шаге, на котором вам предлагается вырезать и вставить URL-адрес веб-службы, который вы хотите использовать для клиента, в поле URL-адреса WSDL, введите https:// полное имя хоста: 8181 /CalculatorApplication/CalculatorWSService?wsdl (изменения выделены жирным шрифтом), чтобы указать, что этот клиент долженобратитесь к веб-службе, используя защищенный порт. При первом доступе к этой службе примите сертификат (s1as) при появлении запроса. Это сертификат сервера, который появляется для подтверждения его подлинности клиенту.
В некоторых случаях может появиться диалоговое окно с сообщением об ошибке, в котором сообщается, что URL-адрес https:// fully-qualified-hostname:8181/CalculatorApplication/CalculatorWSService?wsdl не удалось загрузить. Однако это правильный URL-адрес, и он загружается при запуске службы. Итак, при возникновении этой ошибки повторите шаги по созданию клиента веб-службы с использованием защищенного WSDL. Во второй раз создается ссылка на веб-службу, и вы можете продолжить создание клиента.
Независимо от того, сколько раз я пытаюсь, я все равно получаю одно и то же сообщение об ошибке (прокси не установлены, а сервер запущен с развернутыми службами). WSDL отображается в браузере после принятия сертификата. Если я ввожу базовый URL-адрес WSDL (тот, который не содержит HTTPS), мастер принимает его и генерирует клиент. Что мне нужно сделать, чтобы получить эту работу?
Обновить
То же самое применимо, если я запускаю клиент и службу на разных компьютерах. Я использую сертификат разработки по умолчанию. Вывод ретривера:
Ошибка: произошла ошибка ввода-вывода. sun.security.validator.Исключение ValidatorException: ошибка построения пути PKIX: sun.security.provider.certpath.Исключение SunCertPathBuilderException: не удается найти действительный путь сертификации к запрошенной цели `
Должен ли я устанавливать keytore и truststore в VMargs? Что, если я хочу иметь ссылку на эту службу в том же веб-приложении, которое содержит веб-службы?
Комментарии:
1. Я подозреваю, что сертификата сервера нет в хранилище доверия клиента, и проверка ssl завершается неудачно.
2. @Zaki
The first time you access this service, accept the certificate (s1as) when you are prompted.
Этого не происходит, и я получаю сообщение об ошибке. Я создал рабочий клиент в .NET, и он выдал запрос после того, как я ввел URL-адрес WSDL в мастере.
Ответ №1:
Ответ найден здесь:
Вы должны запустить NetBeans со следующими параметрами:
<NETBEANS_HOME>/bin/netbeans.exe
-J-Djavax.net.ssl.trustStore=<AS_HOME>/domains/domain1/config/cacerts.jks
-J-Djavax.net.ssl.keyStore=<AS_HOME>/domains/domain1/config/keystore.jks
-J-Djavax.net.ssl.trustStorePassword=changeit
-J-Djavax.net.ssl.keyStorePassword=changeit
Я на самом деле установил их в <NETBEANS_HOME>/etc/netbeans.conf
, в netbeans_default_options
. Однако я все еще получаю сообщение об ошибке, это просто привело к тому, что я могу генерировать клиентский код для служб, защищенных SSL. Запуск простого вызова WS приводит к этому:
РЕДАКТИРОВАТЬ ВАЖНО Следующее происходит только в том случае, если вы используете старые библиотеки JAX-WS!
Исключение в потоке «main» javax.xml.ws.WebServiceException: не удается найти ‘https://localhost:8181/myApp/myService?wsdl ‘ wsdl. Правильно поместите ресурс в classpath.
Это можно решить, установив свойство clients DATASTOREWS_WSDL_LOCATION
с помощью метода, подобного этому:
private static URL getURL() {
try {
return new URL("https://localhost:8181/myApp/myService?wsdl");
} catch (MalformedURLException ex) {
Logger.getLogger(DataStoreWS_Service.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
Это необходимо, только если вы создаете его для простого Java-приложения, потому что сгенерированный клиентский код отличается для веб-приложения Java. Кроме того, я просто не мог заставить его работать с полным именем хоста, например, с моим локальным IP. Единственное, что работало, это localhost. Одна важная вещь: не забудьте объединить те же библиотеки Metro, что и на стороне службы! NB сообщение об ошибке.