Статус: Новичок
Группы: Участники
Зарегистрирован: 08.08.2015(UTC) Сообщений: 2 ![Мелкие острова(США) Мелкие острова(США)](/forum2/Content/images/flags/UM.png)
|
Пишу клиента для СМЭВ3. На технологическом портале есть пример на Java, лежит тутОкружение настроил как написано в readme, но там не написано какая версия xmlsec нужна. Пробовал xmlsec-1.5.0.jar не работает, вылетает с ошибкой. Может быть у кого-то уже получилось подписать запрос в СМЭВ3 правильно? Подскажите, пожалуйста.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 08.08.2015(UTC) Сообщений: 2 ![Мелкие острова(США) Мелкие острова(США)](/forum2/Content/images/flags/UM.png)
|
Сам же и отвечу.
Там в pom.xml проекта crypto нужно добавить <dependency> <groupId>org.apache.santuario</groupId> <artifactId>xmlsec</artifactId> <version>1.4.8</version> </dependency> ну и там еще проинициализировать xmlsec в классе DigitalSignatureFactory в начале метода init. Без этого у меня тоже не работало. Какой-то странный код клиента они выложили, тут поделали-поделали - бросили, тут - вообще магия :)
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 14.08.2015(UTC) Сообщений: 5 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Поблагодарили: 8 раз в 1 постах
|
Если используете xmlsec версии 1.5.x в jre/lib/ext Пришлось переписать кусок файла DigitalSignatureFactory.java из данной библиотеки: Код:
package ru.voskhod.crypto;
...
/**
* Все что происходит здесь - магия. В теории этого делать не нужно, т.к. необходимый конфиг лежит внутри Trusted Java, но без этого не работает.
* Желающие могут разобратся.
*
* @throws ru.voskhod.crypto.exceptions.SigLibInitializationException В слуючае если произошли проблемы.
*/
private static void initXmlSec(String algorithmClassName) throws SigLibInitializationException {
try {
// При формировании элемента Signature будут убраны все разрывы между элементами.
System.setProperty("org.apache.xml.security.ignoreLineBreaks", "true");
//Добавил инициализацию из документации jsp : jcp-build-2.0.37027
//Перед началом использования классов из библиотеки XML Security необходимо зарегистрировать ГОСТ алгоритмы.
//initByJCPXmlXmlInit();
initByXmlSecurityWithConfig();
try{
// Реализация дополнительной трансформации.
Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class.getName());
}catch(AlgorithmAlreadyRegisteredException e){
//Ignore this exception
}
} catch (SigLibInitializationException e) {
throw e;
} catch (Exception e) {
throw new SigLibInitializationException("Возникли проблемы при инициализации XmlSec!", e);
}
}
/**
* Метод для инециализации ГОСТ алгоритмов в библиотеке XML Security по средствам вызова стандартного инициализатора org.apache.xml.security.init
*
* Перед началом использования классов из библиотеки XML Security необходимо зарегистрировать ГОСТ алгоритмы.
* Это можнжо сделать вызовом метода ru.CryptoPro.JCPxml.XmlInit.init()
* (старый метод ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init() тоже поддерживается).
*
* Данный метод работает с jcp-build-2.0.37027 если в jre/lib/ext/ библиотека xmlsec версии 1.4
*
* Использовать только если библиотека xmlsec версии 1.4
*/
private static void initByJCPXmlXmlInit() {
System.out.println("ru.CryptoPro.JCPxml.XmlInit.isInitialized() before:"+ru.CryptoPro.JCPxml.XmlInit.isInitialized());
if(!ru.CryptoPro.JCPxml.XmlInit.isInitialized()){
ru.CryptoPro.JCPxml.XmlInit.init();
}
System.out.println("ru.CryptoPro.JCPxml.XmlInit.isInitialized() after:"+ru.CryptoPro.JCPxml.XmlInit.isInitialized());
}
/**
* Метод для инециализации ГОСТ алгоритмов в библиотеке XML Security по средствам JCPxml
*
* Перед началом использования классов из библиотеки XML Security необходимо зарегистрировать ГОСТ алгоритмы.
*
* Это можнжо сделать вызовом стандартного инициализатора org.apache.xml.security.Init.init(),
* который обязателен при работе с библиотекий XML Security,
* но с предварительно установленным свойством
* System.setProperty("org.apache.xml.security.resource.config", "resource/jcp.xml")
*
* Данный метод работает с jcp-build-2.0.37027 если в jre/lib/ext/ библиотека xmlsec версии 1.5
*
* Использовать только если библиотека xmlsec версии 1.4 или 1.5
*/
private static void initByXmlSecurityWithConfig() {
System.setProperty("org.apache.xml.security.resource.config", "resource/jcp.xml");
System.out.println("org.apache.xml.security.Init.isInitialized(): "+org.apache.xml.security.Init.isInitialized());
if(!org.apache.xml.security.Init.isInitialized()){
org.apache.xml.security.Init.init();
}
System.out.println("org.apache.xml.security.Init.isInitialized(): "+org.apache.xml.security.Init.isInitialized());
}
...
Описание в комментариях... Также есть проблема в DigitalSignatureProcessorImpl.java если версия JDK >= 1.7.0_21 Код:
package ru.voskhod.crypto.impl;
...
private static Element signXMLDSig(Document argDocument, Element element2Sign, PrivateKey argPrivateKey, X509Certificate argCertificate, String argSignatureId, boolean enveloped) throws SignatureProcessingException {
try {
Element _element2Sign = element2Sign != null ? element2Sign : argDocument.getDocumentElement();
String referenceURI = _element2Sign.getAttribute("Id");
/******************************************************************************************
Для версии JDK >= 1.7.0_21 на строке xmlSignature.sign(argPrivateKey); возникает ошибка,
что элемент с идентификатором не найден.
Решение найдено:
http://stackoverflow.com/questions/17331187/xml-dig-sig-error-after-upgrade-to-java7u25
Для чтобы исправить необходимо:
Пометить узел атрибута Id - как выполняющий роль идентификатора родительского узла
******************************************************************************************/
Attr attributeNode = _element2Sign.getAttributeNode("Id");
_element2Sign.setIdAttributeNode(attributeNode, true);
if (referenceURI == null || "".equals(referenceURI.trim())) {
referenceURI = _element2Sign.getAttributeNS(WSSU_NS, "Id");
}
if (referenceURI == null || "".equals(referenceURI.trim())) {
referenceURI = "";
}
...
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 03.02.2012(UTC) Сообщений: 35 Откуда: Moscow
|
А кто-нибудь может мне объяснит природу отключения \n. Ну будут текстовые ноды после элементов, но они же также уйдут в поток и будут учтены в подписи. Где подвох? Или это какая-то совместимость с чем-то? |
Luxoft-Москва |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.04.2016(UTC) Сообщений: 35 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Moscow Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Скачал с гитхаба клиент, поставил jdk 1.7.0.5, 1.54 jcp, драйвера для RuToken, собрал. Пытаюсь на примере экзампла всё построить. Перенёс в настройки примера настройки из crypto.properties для SMEVExample При запуске падает с ошибкой, что ключ не может буть null. Вывод Код:
System.out.println(spPrivateKey);
System.out.println(spCertificate);
System.out.println(ovPrivateKey);
System.out.println(ovCertificate);
показывает, что они все пустые. при этом на той же связке jdk+jcp если я запускаю кусок кода из SMEVExample Код:
// Инициализация Transforms алгоритмов.
com.sun.org.apache.xml.internal.security.Init.init();
/*
// Инициализация JCP XML провайдера.
if (!JCPXMLDSigInit.isInitialized()) {
JCPXMLDSigInit.init();
}
// Инициализация null); ключевого контейнера.
KeyStore keyStoreA = KeyStore.getInstance(SpecUtility.DEFAULT_STORETYPE);
keyStoreA.load(null, null);
// Получение ключа и сертификата.
PrivateKey privateKey = (PrivateKey) keyStoreA.getKey(SpecUtility.DEFAULT_ALIAS, SpecUtility.DEFAULT_PASSWORD);
X509Certificate cert = (X509Certificate) keyStoreA.getCertificate(SpecUtility.DEFAULT_ALIAS);
и ключ и сертификат находит и извлекает. crypto.properties: Код:
org.apache.ws.security.crypto.provider=wss4j.wss4j1_6_3.ws.security.components.crypto.MerlinEx
org.apache.ws.security.crypto.merlin.keystore.provider=JCP
org.apache.ws.security.crypto.merlin.keystore.type=RutokenStore
org.apache.ws.security.crypto.merlin.keystore.alias=RaUser-xxxxxxxx
org.apache.ws.security.crypto.merlin.keystore.password=123123123
настройки примера для клиента Код:
// "JCP" или "DIGT"
private static final String CRYPTO_PROVIDER = "JCP";
// имя хранилища
private static final String STORE_NAME = "RutokenStore";
// имя контейнера ЭП-ОВ
private static final String CONTAINER_ALIAS = "RaUser-xxxxxxxx";
// пароль для контейнера ЭП-ОВ
private static final String CONTAINER_PASSWORD = "123123123";
// имя контейнера ЭП-СП
private static final String PERSONAL_CONTAINER_ALIAS = "RaUser-xxxxxxxx";
// пароль для контейнера ЭП-СП
private static final String PERSONAL_CONTAINER_PASSWORD = "123123123";
xmlsec в jre/lib/ext лежит версии 1.4.2
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Включить логирование в wss4j возможно? Вероятно, crypto.properties не читается либо настроен неправильно. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.04.2016(UTC) Сообщений: 35 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Moscow Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Насколько я понял сам "клиент" он неиспользует crypto.properties и берёт всё это параметрами при инициализации. Но что то внутри DigitalSignatureFactory идёт не так. Код:KeyStoreWrapper keyStore = DigitalSignatureFactory.getKeyStoreWrapper();
Пока решил проблему тем, что оставил инициализацию Фабрики подписей из примера использования клиента Код:DigitalSignatureFactory.init(CRYPTO_PROVIDER);
Далее получаю keyStore и Ключ + серт без обёрток и врапперов, которые предлагает использовать клиент Код:KeyStore keyStoreA = KeyStore.getInstance(SpecUtility.DEFAULT_STORETYPE);
keyStoreA.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStoreA.getKey(SpecUtility.DEFAULT_ALIAS, SpecUtility.DEFAULT_PASSWORD);
X509Certificate cert = (X509Certificate) keyStoreA.getCertificate(SpecUtility.DEFAULT_ALIAS);
а дальше уже работают дальше в соответствии с "клиентским" Example
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.04.2016(UTC) Сообщений: 35 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Moscow Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
Столкнулся с тем, что клиент возвращает эксепшен, о том что сообщение не соответствует бизнес логике и стало совершенно не понятно как проверить что он шлёт. Т.к. вывод запроса и ответа дают null. А есть подозрение, что шлёт он всё таки что то дельное, т.к. эксепшена на подпись нету, а сразу на структуру Код:
// можно включить трассировку запросов и ответов (по умолчанию выключена)
InterceptorStorage.getRequest().setIntercept(true);
InterceptorStorage.getResponse().setIntercept(true);
// отправляем сообщение
try {
// используем ЭП-СП:
PersonalSigner signPersonal = new KeyPersonalSignerImpl(spPrivateKey, spCertificate);
messageExchange.getRequest(null);
messageExchange.sendRequest(messageID, content, signPersonal, null, attachmentList);
} catch (Exception exception) {
// тут могут быть разные exception в зависимости от ответа сервиса
exception.printStackTrace(System.err);
}
// через InterceptorStorage можно получить конверты запроса и ответа
System.out.println(InterceptorStorage.getRequest().getString());
System.out.println(InterceptorStorage.getResponse().getString());
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 28.04.2016(UTC) Сообщений: 35 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Moscow Сказал(а) «Спасибо»: 1 раз Поблагодарили: 2 раз в 2 постах
|
В общем сделал свою точку входа, повесил туда wsdl с тестового смева и сделал логирование данных в файл. В итоге обнаружил, что хотя визуально всё работает, система формирует запрос, подписывает и отправляет, на практике данные поставщику в конверт не добавляются и запрос поставщику выглядит так: Код:
<MessageTypeSelector Id="SIGNED_BY_CALLER">
<Timestamp>2016-06-22T15:20:15.554+04:00</Timestamp>
</MessageTypeSelector>
То есть всё что я пытаюсь "запихнуть" в контент - игнорируется. Как и добавляемые в аттачмент файлы.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 25.08.2016(UTC) Сообщений: 17 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Белгород Сказал(а) «Спасибо»: 7 раз
|
Есть какие-нибудь результаты ?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close