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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Cynepnaxa  
#1 Оставлено : 7 сентября 2012 г. 19:14:27(UTC)
Cynepnaxa

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

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

Добрый день!
Хочу заиспользовать JCP в WSS4j, подобно тому как это сделано в примере

wss4j.wss4j1_6_3.bad.TestDubl

в примере test_jcp_wss4j1_6.tar.gz со страницы http://www.cryptopro.ru/...pomoshchyu-kriptopro-jcp
мне кажется, что в этом примере сообщение формируется наиболее правильным образом, похоже на пример из SignatureTest в wss4j.
У меня сейчас сообщение формируется нормальное, xmlns не дублируются.
Дошел до проверки подписи сообщения - ошибка "Неправильная подпись".
Подскажите пожалуйста, кто "проходил" этот пример, в чем может быть проблема и с чем ешё сталкивались?

И может быть кто-нибудь поделится примером рабочего кода? А то возникают ошибки, а я не знаю куда копать и должен ли вообще этот wss4j.wss4j1_6_3.bad.TestDubl работать...
Offline Евгений Афанасьев  
#2 Оставлено : 7 сентября 2012 г. 19:32:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Скачайте примеры для 1.5.11, они похожи на TestDubl. Последний был сделан для выявления проблемы дублирования xmlns в jre 1.6, потом эта проблема была устранена (должен работать).
Offline Cynepnaxa  
#3 Оставлено : 10 сентября 2012 г. 10:30:45(UTC)
Cynepnaxa

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

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

Спасибо, значит имеет смысл возиться с этим примером.
Пример у меня выдает ошибку:

org.apache.ws.security.WSSecurityException: The signature or decryption was invalid

Глянул в код - заметил такое несоответствие:

Код:
	    Document signedDoc = null;
	    
	    try {
	    	// Sign SOAP XML document
			signedDoc = sign.build(doc, crypto, secHeader);
		} catch (WSSecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    
		// See duplicated xmlns
	    String docStr = org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc);
	    System.out.println("Bad signed document: " + docStr);
	    
	    WSSecurityEngineResult actionResult = null;
		// Verify signature and see that it's wrong because of excess xmlns
		try {
			List<WSSecurityEngineResult> results = secEngine.processSecurityHeader(doc, null, null, crypto);
			actionResult = WSSecurityUtil.fetchActionResult(results, WSConstants.SIGN);
		
		} catch (WSSecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


List<WSSecurityEngineResult> results = secEngine.processSecurityHeader(doc, null, null, crypto);

Т.е. производится проверка неподписанного документа. Заменил doc на signedDoc - ошибка та же. А я вообще тот пример использую? Дайте пожалуйста код примера wss4j.wss4j1_6_3.bad.TestDubl или аналогичного (с неявным использованием JCP), который у вас точно отрабатывает.
А то может я не то скачал...
И ещё вопрос возник - проблема дублирования xmlns в jre 1.6 была устранена в новых версиях JCP, или речь про переход на jre 1.7?

Отредактировано пользователем 10 сентября 2012 г. 10:34:55(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 10 сентября 2012 г. 14:39:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Сообщение The signature or decryption was invalid говорит о том, что подпись неверна. У меня этот пример работает. Давайте разберемся. Отличается ли пример подписываемого XML сообщения от того, что в примере, или используется документ из примера? Какая версия xmlsec, wss4j?
После исправлений в xmldsigri дублирования xmlns нет в jre 1.6 и 1.7.
А doc (как и signedDoc) содержит блок SignedInfo и др., иначе при проверке неподписанного документа actionResult должен содержать null.

Отредактировано пользователем 10 сентября 2012 г. 14:51:01(UTC)  | Причина: Не указана

Offline Cynepnaxa  
#5 Оставлено : 10 сентября 2012 г. 17:03:52(UTC)
Cynepnaxa

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

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

Сейчас попробовал все с начала.
1) Есть jdk 1.7_03. JCP 1.0.52. Библиотеки JCP я перенес в проект, а то начинаешь запускать - они за собой ещё кучу требуют внутрь джавы скопировать.
2) Распаковываю test_jcp_wss4j1_6.tar.gz, добавляю содержимое в новый eclpse - проект и туда же библотеки JCP из jdk, wss4j и её зависимости.
3) Правлю WebContent/crypto.properties. Подставляю свои значения для ключей. Только CRL у меня нету, поэтому его закоментировал.
4) Запускаю wss4j.wss4j1_6_3.bad.TestDubl. Говорит, что не найден data/WebContent/crypto.properties. Переношу WebContent в data.
5) Запускаю ещё раз - подписал нормально, при проверке ошибка:

org.apache.ws.security.WSSecurityException: The signature or decryption was invalid
at org.apache.ws.security.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:407)
at org.apache.ws.security.processor.SignatureProcessor.handleToken(SignatureProcessor.java:197)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:396)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:303)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:248)
at org.apache.ws.security.WSSecurityEngine.processSecurityHeader(WSSecurityEngine.java:202)
at wss4j.wss4j1_6_3.bad.TestDubl.main(TestDubl.java:119)
Caused by: javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2001/0...#gostr34102001-gostr3411
at org.apache.jcp.xml.dsig.internal.dom.DOMSignatureMethod.unmarshal(DOMSignatureMethod.java:135)
at org.apache.jcp.xml.dsig.internal.dom.DOMSignedInfo.<init>(DOMSignedInfo.java:154)
at org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignature.<init>(DOMXMLSignature.java:141)
at org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(DOMXMLSignatureFactory.java:186)
at org.apache.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(DOMXMLSignatureFactory.java:146)
at org.apache.ws.security.processor.SignatureProcessor.verifyXMLSignature(SignatureProcessor.java:374)
... 6 more
Verified: null

6) Меняю doc на signDoc - тоже самое.
Offline Евгений Афанасьев  
#6 Оставлено : 10 сентября 2012 г. 17:30:48(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Cynepnaxa написал:
at org.apache.jcp.xml.dsig.internal.dom.DOMSignatureMethod

XMLDSigRI подключен? По идее, должен быть пакет примерно такой: ru.CryptoPro.JCPxml.dsig....
Offline Cynepnaxa  
#7 Оставлено : 10 сентября 2012 г. 18:42:16(UTC)
Cynepnaxa

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

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

Спасибо! Да, пакет подключен, код примера я не менял. Может дело в том, что я библиотеки JCP из JRE в проект перенес? Но если их в JRE оставить, то classloader, который грузит эти библиотеки требует ещё других библиотек. И насколько я помню при добавлении очередной библиотеки у меня JRE сломалась с какой-то фееричной ошибкой.

Кстати сразу не заметил - а он же пишет

Код:
Caused by: javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411


Получается точно не видит алгоритма. Странно что при этом подпись нормально проходит.

Код примера:

Код:
public class TestDubl {

	private static Crypto crypto = null;
	private static WSSecurityEngine secEngine = new WSSecurityEngine();
	
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {

		// Initialize JCP
		com.sun.org.apache.xml.internal.security.Init.init();
		SpecUtility.initJCP();
		
		// Load CryptoPro XMLDSig service provider
		Provider provCryptoProRI = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();
		Security.addProvider(provCryptoProRI);
		
		// Override methods
		Security.getProvider("XMLDSig").put("XMLSignatureFactory.DOM", 
		        "ru.CryptoPro.JCPxml.dsig.internal.dom.DOMXMLSignatureFactory");
		Security.getProvider("XMLDSig").put("KeyInfoFactory.DOM", 
		        "ru.CryptoPro.JCPxml.dsig.internal.dom.DOMKeyInfoFactory");
		
		// Prepare SOAP message
		SOAPEnvelope unsignedEnvelope = SOAPUtility.getSOAPEnvelopeFromString(SOAPUtility.SOAPMSG);
		Document doc = unsignedEnvelope.getAsDocument();
	    WSSecHeader secHeader = new WSSecHeader();
	    secHeader.insertSecurityHeader(doc);
	    	 
	    // Create Merlin to execute cryptographic operations
	    Merlin merlin = new Merlin();
		merlin.setKeyStore(SpecUtility.loadKeyStore(SpecUtility.DEFAULT_STORETYPE, null, 
				SpecUtility.DEFAULT_PASSWORD));
		crypto = merlin;

		// Prepare object to sign SOAP message (alias, password, algorithm etc)
		WSSecSignature sign = new WSSecSignature();
		
		String pswrd = null;
		if (SpecUtility.DEFAULT_PASSWORD != null) {
			pswrd = new String(SpecUtility.DEFAULT_PASSWORD);
		}
		
		sign.setUserInfo(SpecUtility.DEFAULT_ALIAS, pswrd);
	    sign.setKeyIdentifierType(WSConstants.BST_DIRECT_REFERENCE);
	    sign.setSignatureAlgorithm(ru.CryptoPro.JCPxml.Consts.URI_GOST_SIGN);
	    sign.setDigestAlgo(ru.CryptoPro.JCPxml.Consts.URI_GOST_DIGEST);
	    
	    Document signedDoc = null;
	    
	    try {
	    	// Sign SOAP XML document
			signedDoc = sign.build(doc, crypto, secHeader);
		} catch (WSSecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    
		// See duplicated xmlns
	    String docStr = org.apache.ws.security.util.XMLUtils.PrettyDocumentToString(signedDoc);
	    System.out.println("Bad signed document: " + docStr);
	    WSSecurityEngineResult actionResult = null;
		// Verify signature and see that it's wrong because of excess xmlns
		try {
			List<WSSecurityEngineResult> results = secEngine.processSecurityHeader(signedDoc, null, null, crypto);
			actionResult = WSSecurityUtil.fetchActionResult(results, WSConstants.SIGN);
		} catch (WSSecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// Wrong document shows 'null'
		System.out.println("Verified: " + actionResult);
	}
}
Offline Евгений Афанасьев  
#8 Оставлено : 10 сентября 2012 г. 19:17:41(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Библиотеки JCP должны находиться в lib/ext (+ xalan (2.7), serializer (2.7), commons-logging (1.1), xmlsec (1.4-1.5)). Нужно разбираться, почему ломается jre, при добавлении какой библиотеки (возможно, использующейся при проверке подписи средствами jcp + wss4j). Пример верный.
Offline Cynepnaxa  
#9 Оставлено : 11 сентября 2012 г. 17:35:44(UTC)
Cynepnaxa

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

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

Попробовал TestDubl с нуля по инструкции - всё равно при проверке подписи возникает

javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2001/0...#gostr34102001-gostr3411

такое ощущение, что JCP не инициализирован, хотя в начале примеры все мыслимые инициализационные конструкции указаны.

единственное отход от инструкции - patchLevel библиотек у меня повыше. Может это влиять? Нужно точно ту версию библиотек, которые указаны в инструкции?
Offline Cynepnaxa  
#10 Оставлено : 11 сентября 2012 г. 17:41:59(UTC)
Cynepnaxa

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

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

При этом другие тестовые примеры из test_jcp_wss4j1_6.tar.gz работают. Но хочется грамотно заюзать КриптоПро, как в TestDubl. Может быть надо как-нибудь WSSecurityEngine инициализировать? Пробовал примеры из test_jcp_wss4j1_5.tar.gz, но там тоже ошибки вылезли - откуда-то xmlsec 1.5 вместо 1.4 тянет. Сейчас попробую с нуля всё развернуть.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.