Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline legsy  
#1 Оставлено : 8 августа 2015 г. 20:21:41(UTC)
legsy

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.08.2015(UTC)
Сообщений: 2
Мелкие острова(США)

Пишу клиента для СМЭВ3.
На технологическом портале есть пример на Java, лежит тут

Окружение настроил как написано в readme, но там не написано какая версия xmlsec нужна. Пробовал xmlsec-1.5.0.jar не работает, вылетает с ошибкой.
Может быть у кого-то уже получилось подписать запрос в СМЭВ3 правильно? Подскажите, пожалуйста.
Offline legsy  
#2 Оставлено : 10 августа 2015 г. 10:00:11(UTC)
legsy

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.08.2015(UTC)
Сообщений: 2
Мелкие острова(США)

Сам же и отвечу.

Там в pom.xml проекта crypto нужно добавить
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>1.4.8</version>
</dependency>
ну и там еще проинициализировать xmlsec в классе DigitalSignatureFactory в начале метода init. Без этого у меня тоже не работало.
Какой-то странный код клиента они выложили, тут поделали-поделали - бросили, тут - вообще магия :)
Offline alexey_kozlov  
#3 Оставлено : 14 августа 2015 г. 13:16:23(UTC)
alexey_kozlov

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.08.2015(UTC)
Сообщений: 5
Российская Федерация

Поблагодарили: 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 = "";
            }
...



Offline ikonovalov  
#4 Оставлено : 1 марта 2016 г. 0:49:23(UTC)
ikonovalov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 03.02.2012(UTC)
Сообщений: 35
Откуда: Moscow

А кто-нибудь может мне объяснит природу отключения \n. Ну будут текстовые ноды после элементов, но они же также уйдут в поток и будут учтены в подписи. Где подвох? Или это какая-то совместимость с чем-то?
Luxoft-Москва
Offline lstef  
#5 Оставлено : 21 июня 2016 г. 10:30:15(UTC)
lstef

Статус: Активный участник

Группы: Участники
Зарегистрирован: 28.04.2016(UTC)
Сообщений: 35
Российская Федерация
Откуда: 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
Offline Евгений Афанасьев  
#6 Оставлено : 21 июня 2016 г. 12:01:02(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Включить логирование в wss4j возможно? Вероятно, crypto.properties не читается либо настроен неправильно.
Offline lstef  
#7 Оставлено : 21 июня 2016 г. 13:16:07(UTC)
lstef

Статус: Активный участник

Группы: Участники
Зарегистрирован: 28.04.2016(UTC)
Сообщений: 35
Российская Федерация
Откуда: 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
Offline lstef  
#8 Оставлено : 22 июня 2016 г. 8:10:53(UTC)
lstef

Статус: Активный участник

Группы: Участники
Зарегистрирован: 28.04.2016(UTC)
Сообщений: 35
Российская Федерация
Откуда: 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());

Offline lstef  
#9 Оставлено : 22 июня 2016 г. 15:40:41(UTC)
lstef

Статус: Активный участник

Группы: Участники
Зарегистрирован: 28.04.2016(UTC)
Сообщений: 35
Российская Федерация
Откуда: Moscow

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
В общем сделал свою точку входа, повесил туда wsdl с тестового смева и сделал логирование данных в файл.
В итоге обнаружил, что хотя визуально всё работает, система формирует запрос, подписывает и отправляет, на практике данные поставщику в конверт не добавляются и запрос поставщику выглядит так:

Код:

<MessageTypeSelector Id="SIGNED_BY_CALLER">
	<Timestamp>2016-06-22T15:20:15.554+04:00</Timestamp>
</MessageTypeSelector>


То есть всё что я пытаюсь "запихнуть" в контент - игнорируется.
Как и добавляемые в аттачмент файлы.
Offline t1nk  
#10 Оставлено : 16 сентября 2016 г. 17:13:58(UTC)
t1nk

Статус: Участник

Группы: Участники
Зарегистрирован: 25.08.2016(UTC)
Сообщений: 17
Российская Федерация
Откуда: Белгород

Сказал(а) «Спасибо»: 7 раз
Есть какие-нибудь результаты ?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.