Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JAXB marshal unmarshal Сломана Signature / 9 сообщений из 9, страница 1 из 1
11.12.2014, 16:35
    #38831633
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Доброго всем времени суток!
Подскажите, пожалуйста, может кто сталкивался.

Есть всдл сервиса. Сгенерирована структура классов явы, с помощью cxf.

Сервис ожидает подписанную часть сообщения.
Приблизительная структура:

+Request
+- RequestData


Вот эта RequestData должна быть подписана.

Подписываю стандартно. Приблизительно таким же образом:
http://stackoverflow.com/questions/17193550/jaxb-marshalling-with-xmldsig-signature


На вход подается xml, который был получен маршалингом с джаксби:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
RequestData requestData = new RequestData();
requestData .set(...)

jaxbContext = JAXBContext.newInstance(ObjectFactory.class, RequestData.class);

StringWriter writer = new StringWriter();
            JAXB_CONTEXT.createMarshaller().marshal(requestData , writer)
String xmlToSign = writer.getBuffer().toString()

String signedXml = sign(xmlToSign);



На этом этапе проверяю signedXml - всё нормально. Валидация проходит успешно.

После подписи демаршалинг:

Код: java
1.
2.
3.
4.
5.
RequestData requestData = (RequestData) JAXB_CONTEXT.createUnmarshaller().unmarshal(new StringReader(signedXml));
Request request = new Request();
request.setRequestData(requestData);

service.makeRequest(request);



И всё. Подпись становится невалидной.
Я пробовал вытянуть снова xml уже с Request объекта и валидировать подпись - да, невалидна.

Скажите, у кого-то были такие проблемы уже и как он с этим боролся? Мне ведь нужно в объект вогнать подпись... Какие пути решения возможны? Пока не нашел.. :(

Спасибо за идеи и отклик.
______________________________________________________
while(!death){
Life.liveAndBeHappy();
}
...
Рейтинг: 0 / 0
11.12.2014, 16:38
    #38831642
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Большой Синий Кит,

Сравни xmlToSign и XML из запроса. Если подпись стала не валидной, значит кто-то что-то поменял в XML.
...
Рейтинг: 0 / 0
11.12.2014, 16:39
    #38831644
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Так его поменял jaxb. В этом проблема.. Вот тут нашел похожее описание:

jaxb.formatted.output property
...
Рейтинг: 0 / 0
11.12.2014, 16:40
    #38831645
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
jaxb.formatted.output property пробовал - безрезультатно...
...
Рейтинг: 0 / 0
11.12.2014, 16:41
    #38831647
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Вот ссылка (прошу прощения за много сообщений, редактирования нет просто):
https://www.java.net/node/684787
...
Рейтинг: 0 / 0
14.12.2014, 21:31
    #38833608
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Может, кому понадобится.

Сигнатура учитывает и префиксы неймспесов.
Дело было в том, что при маршалинге джаксби не добавлял prefix of namespace для элементов RequestData.
Это решилось путем добавления в package-info.java
Код: java
1.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://.....", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns={@XmlNs(prefix = "ns1", namespaceURI = "http://..../elements")})



А также джаксби не добавлял префикс и для элемента сигнатуры. Решилось путем:
Код: java
1.
2.
DOMSignContext signContext = ...;
signContext.setDefaultNamespacePrefix("...");



В signContext сейчас выставил тот префикс, который генерит для подписи в результирующем запросе джаксби (для проверки). Валидация проходит норм. Еще не смотрел, как насильно выставить префикс для неймспейса стороннего разработчика в джаксби.
...
Рейтинг: 0 / 0
14.12.2014, 21:34
    #38833609
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Вроде как можно через
NamespacePrefixMapper
но надо смотреть.
...
Рейтинг: 0 / 0
14.12.2014, 23:49
    #38833663
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Собственно, то же самое можно прописать в package-info.java и для подписи. Не проблема.
Но лучше реализовать, возможно, через NamespacePrefixMapper.Это в том случае, если при каждом билде регенерятся классы на основе wsdl (часто меняющиеся, например).
...
Рейтинг: 0 / 0
20.12.2014, 22:53
    #38838848
Большой Синий Кит
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JAXB marshal unmarshal Сломана Signature
Апдейт для тех, кто ищет.

Если ява генерится из всдл каждый билд, лучше (да и вообще, так надо делать всегда) делать через jaxb bindings. Есть плагин под яву, с помощью которого можно генерить package-info.java с нужными неймспейс-префиксами.

NamespacePrefixMapper не поможет.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JAXB marshal unmarshal Сломана Signature / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]