Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Вызов .NET веб-службы (WSE 2/3, WS-Security) из Java
Мне нужно позвонить в веб-сервис, написанный на .NET из Java. Веб-служба реализует стек WS-Security (либо WSE 2, либо WSE 3, это не ясно из имеющейся у меня информации).
Информация, которую я получил от поставщика услуг, включала WSDL, файл policyCache.config, некоторый пример кода C# и пример приложения, которое может успешно вызвать службу.
Это не так полезно, как кажется, потому что не ясно, как я должен использовать эту информацию для написания клиента Java. Если запрос веб-службы не подписан в соответствии с политикой, то он отклоняется службой. Я пытаюсь использовать Apache Axis2 и не могу найти никаких инструкций, как я должен использовать файл policyCahce.config и WSDL для создания клиента.
Есть несколько примеров, которые я нашел в интернете, но во всех случаях авторы примеров имели контроль как над сервисом, так и над клиентом, и поэтому смогли сделать настройки с обеих сторон, чтобы заставить его работать. Я не нахожусь в таком положении.
Кто-нибудь сделал это успешно?
Спецификации WS-Security обычно не содержатся в A WSDL (никогда в A WSE WSDL). Таким образом, wsdl2java не знает, что WS-Security даже требуется для этой службы. Тот факт, что ограничения безопасности отсутствуют в A WSE WSDL, является для меня большим разочарованием (WCF будет включать информацию WS-Trust в A WSDL).
На клиентском конце вам нужно будет использовать Rampart для добавления необходимых заголовков WS-Security к исходящему сообщению клиента. Поскольку WSDL не сообщает, какие параметры WS-Security необходимы, лучше всего спросить поставщика услуг, что требуется. WS-безопасности требования может быть простой пароль в виде простого текста, или может быть сертификатов x509, или может быть зашифрованное сообщение..... Rampart должен быть в состоянии справиться с большинством из этих сценариев.
Apache Rampart - это "turned on", используя модуль в вашем файле axis2.xml. Вам нужно будет скачать модуль Rampart и поместить его в определенное место в вашем каталоге axis2, а затем изменить файл xml. Вы также можете использовать Rampart программно (пожалуйста, отредактируйте свой первоначальный вопрос, если это требование, и я отредактирую этот ответ).
В зависимости от того, как вы настроите rampart (через другие файлы XML или программно), он будет перехватывать любые исходящие сообщения и добавлять к ним необходимую информацию WS-Security. Я лично использовал axis2 с rampart для вызова службы WSE3, которая защищена с помощью UsernameToken в открытом тексте, и это отлично сработало. Аналогичные, но более продвинутые сценарии также должны работать. Более подробную информацию о том, как настроить и начать работу с Rampart, можно найти на сайте, связанном выше. Если у вас есть проблемы с особенностями Rampart или как использовать Rampart с вашей конкретной установкой WSE, то отредактируйте свой вопрос, и я постараюсь ответить на него.
Это, кажется, популярный вопрос, поэтому я приведу обзор того, что мы сделали в нашей ситуации.
Похоже, что службы, встроенные в .NET, следуют более старому стандарту WS-адресации (http://schemas.xmlsoap.org/ws/2004/03/addressing/), а axis2 понимает только новый стандарт ( http://schemas.xmlsoap.org/ws/2004/08/addressing/).
Кроме того, предоставленный файл policyCache.config находится в форме, которую модуль axis2 rampart не может понять.
Итак, шаги, которые мы должны были сделать, в двух словах:
- Прочитайте policyCache.config и попытайтесь понять его. Затем перепишите его в политику, которую rampart мог бы понять. (Некоторые обновленные документы помогли.)
- Настроить вал с этой политикой.
- Возьмите ключи, которые были предоставлены в файле .pfx, и преобразуйте их в хранилище ключей java. Есть утилита, которая поставляется с Jetty, которая может это сделать.
- Настроить вал с ключом магазин.
- Напишите пользовательский обработчик axis2, который обратным образом преобразует новый материал ws-addressing, который выходит из axis2, в более старый материал, ожидаемый службой.
- Настройте axis2 для использования обработчика исходящих сообщений.
В конце концов, это было много конфигурации и кода для чего-то, что должно быть открытым стандартом, поддерживаемым поставщиками.
Хотя я не уверен, что альтернатива is...can вы ждете поставщиков (или в данном случае одного поставщика), чтобы убедиться, что все будет взаимо-ОП?
В качестве постскриптума я добавлю, что я не закончил работу, это был кто-то другой из моей команды, но я думаю, что я правильно понял основные детали. Другой вариант, который я рассматривал (до того, как мой товарищ по команде взял на себя ответственность), состоял в том, чтобы вызвать WSS4J API напрямую, чтобы построить конверт SOAP, как этого ожидала служба .NET. Я думаю, что это тоже сработало бы.
@Mike
Я недавно сделал тест, и это код, который я использовал. Я не использую политику, но я использовал WS-Security с простой текстовой аутентификацией. CXF имеет действительно хорошую документацию о том, как выполнить этот материал.
Я использовал wsdl2java, а затем добавил этот код для использования веб-службы с ws-security.
Надеюсь, это вам поможет.
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.handler.WSHandlerConstants;
public class ServiceTest implements CallbackHandler
{
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
// set the password for our message.
pc.setPassword("buddah");
}
public static void main(String[] args){
PatientServiceImplService locator = new PatientServiceImplService();
PatientService service = locator.getPatientServiceImplPort();
org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy.getClient(service);
org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN + " " + WSHandlerConstants.TIMESTAMP);
outProps.put(WSHandlerConstants.USER, "joe");
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
// Callback used to retrieve password for given user.
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, ServiceTest.class.getName());
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
cxfEndpoint.getOutInterceptors().add(wssOut);
try
{
List list = service.getInpatientCensus();
for(Patient p : list){
System.out.println(p.getFirstName() + " " + p.getLastName());
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}