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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline gerasimenko  
#1 Оставлено : 30 июля 2012 г. 16:15:38(UTC)
gerasimenko

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

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

Господа, помогите, пожалуйста, разобраться с нашей проблемой.

Мы подписываем XML-элемент внутри XML-документа, но принимающая сторона сообщает об ошибке проверки ЭЦП. В прилагаемых файлах находится пример документа до подписания и после. Чтобы избежать разночтений с кодировками и пробелами, мы сделали самый простой XML без пробелов и без русского текста, он содержит только одно число. И даже в таком простом документе нашу ЭЦП не принимают.

На нашей стороне, где происходит подписание, работает следующее ПО:

1. Крипто-Про JCP 1.0.52
2. Apache XML Security for Java 1.4.6

Принимающая сторона, которая проверяет подпись использует другое ПО (со слов их разработчиков):

1. Крипто-Про 3.6R3 (используется capi20)
2. Apache Santuario 1.4.4

Когда на принимающей стороне проверяют ЭЦП, то получают сообщение вот такого вида:

27.06.12 15:32:34.607,main,WARN,Reference,Verification failed for URI ""
27.06.12 15:32:34.607,main,WARN,Reference,Expected Digest: OSu12PbzIIJg4uuTNnI+Aa4Rx7fC6h5V3hLiX7fbfoQ=
27.06.12 15:32:34.607,main,WARN,Reference,Actual Digest: ud3s7de+naTxbLKlQ+vlvAYUH1EhjQeR9L034zV8TLY=

На чьей стороне ошибка, на стороне того, кто создает сообщение, или у тех, кто его проверяет? С чем связана эта ошибка и как ее исправить?

Спасибо.
Вложение(я):
singed-4481167995637542322.xml (3kb) загружен 22 раз(а).
unsinged-4481167995637542322.xml (1kb) загружен 15 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Евгений Афанасьев  
#2 Оставлено : 30 июля 2012 г. 16:29:28(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
Здравствуйте.
В JCP используете JCPxml для подписи xml?
Offline sergey-b  
#3 Оставлено : 30 июля 2012 г. 17:08:48(UTC)
sergey-b

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

Группы: Участники
Зарегистрирован: 26.06.2012(UTC)
Сообщений: 7

Поблагодарили: 1 раз в 1 постах
Да, мы используем JCPxml.
Offline Евгений Афанасьев  
#4 Оставлено : 30 июля 2012 г. 17:11:24(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
У вас подписанный документ проверяется?
Offline sergey-b  
#5 Оставлено : 30 июля 2012 г. 17:23:02(UTC)
sergey-b

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

Группы: Участники
Зарегистрирован: 26.06.2012(UTC)
Сообщений: 7

Поблагодарили: 1 раз в 1 постах
Да. У меня продписанный документ нормально проверяется.
Offline sergey-b  
#6 Оставлено : 30 июля 2012 г. 18:24:59(UTC)
sergey-b

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

Группы: Участники
Зарегистрирован: 26.06.2012(UTC)
Сообщений: 7

Поблагодарили: 1 раз в 1 постах
Если бы кто-нибудь еще проверил в моем документе подпись и подтвердил бы ее правильность, то я мог бы смело утверждать, что ошибка в ПО у наших контрагентов.
Offline Евгений Афанасьев  
#7 Оставлено : 30 июля 2012 г. 18:34:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
Я проверял с помощью XMLDSigRI - у меня проверилась. С помощью CSP пока еще не пробовал. Сервис провайдер находится по адресу http://www.cryptopro.ru/...pomoshchyu-kriptopro-jcp (см. для версии 1.6). Требует xmlsec-1.5.0.jar (см. ридми). Пример проверки:
Код:

import javax.xml.crypto.*;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.*;

import java.io.FileInputStream;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import ru.CryptoPro.JCPxml.Consts;

/**
 * This is a simple example of validating an XML 
 * Signature using the JSR 105 API. It assumes the key needed to
 * validate the signature is contained in a KeyValue KeyInfo. 
 */
public class ValidateByCert {

    //
    // Synopsis: java ValidateByCert [document]
    //
    //	  where "document" is the name of a file containing the XML document
    //	  to be validated.
    //
    public static void main(String[] args) throws Exception {

    System.out.println("###### Test ValidateByCert is begun ######");
    	
	// Instantiate the document to be validated
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	dbf.setNamespaceAware(true);
	Document doc =
            dbf.newDocumentBuilder().parse(new FileInputStream("...\\singed-4481167995637542322.xml"));

	// Find Signature element
	NodeList nl = 
	    doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
	if (nl.getLength() == 0) {
	    throw new Exception("Cannot find Signature element");
	}
	
	com.sun.org.apache.xml.internal.security.Init.init();
	
    Provider pxml = new ru.CryptoPro.JCPxml.dsig.internal.dom.XMLDSigRI();

	// Create a DOM XMLSignatureFactory that will be used to unmarshal the 
	// document containing the XMLSignature 
	XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", pxml);

	// Create a DOMValidateContext and specify a KeyValue KeySelector
        // and document context
	DOMValidateContext valContext = new DOMValidateContext
	    (new X509CertificateSelector(), nl.item(0));
	
	// unmarshal the XMLSignature
	XMLSignature signature = fac.unmarshalXMLSignature(valContext);

	// Validate the XMLSignature (generated above)
	boolean coreValidity = signature.validate(valContext); 

	// Check core validation status
	if (coreValidity == false) {
    	    System.err.println("Signature failed core validation"); 
	    boolean sv = signature.getSignatureValue().validate(valContext);
	    System.out.println("signature validation status: " + sv);
	    // check the validation status of each Reference
	    Iterator i = signature.getSignedInfo().getReferences().iterator();
	    for (int j = 0; i.hasNext(); j++) {
		boolean refValid = 
		    ((Reference) i.next()).validate(valContext);
		System.out.println("ref[" + j + "] validity status: " + refValid);
	    }
	} else {
    	    System.out.println("Signature passed core validation");
	}
	
	System.out.println("###### Test ValidateByCert is finished ######");
	
    }
    
    /**
     * X509CertificateSelector which retrieves the public key out of the
     * X509Certificate(X509Data) element and returns it.
     * NOTE: If the key algorithm doesn't match signature algorithm,
     * then the public key will be ignored.
     */
    private static class X509CertificateSelector extends KeySelector {
	public KeySelectorResult select(KeyInfo keyInfo,
                                        KeySelector.Purpose purpose,
                                        AlgorithmMethod method,
                                        XMLCryptoContext context)
            throws KeySelectorException {
            if (keyInfo == null) {
		throw new KeySelectorException("Null KeyInfo object!");
            }
            SignatureMethod sm = (SignatureMethod) method;
            List list = keyInfo.getContent();

            for (int i = 0; i < list.size(); i++) {
            	XMLStructure xmlStructure = (XMLStructure) list.get(i);
            	if (xmlStructure instanceof X509Data) {
                    X509Data data = (X509Data)xmlStructure;
                    X509Certificate cert = (X509Certificate) data.getContent().get(0);
            		PublicKey pk = cert.getPublicKey();
                    // make sure algorithm is compatible with method
                    if (algEquals(sm.getAlgorithm(), pk.getAlgorithm())) {
                        return new SimpleKeySelectorResult(pk);
                    }
            	}
            }
            throw new KeySelectorException("No KeyValue element found!");
	}

        //@@@FIXME: this should also work for key types other than GOST3410
	static boolean algEquals(String algURI, String algName) {
            if (algName.equalsIgnoreCase("DSA") &&
            		algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) {
            	return true;
            } else if (algName.equalsIgnoreCase("RSA") &&
                       algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)) {
            	return true;
            } 
            else if (algName.equalsIgnoreCase("GOST3410") &&
                    (algURI.equalsIgnoreCase(ru.CryptoPro.JCPxml.Consts.URI_GOST_SIGN) ||
                     algURI.equalsIgnoreCase(ru.CryptoPro.JCPxml.Consts.URN_GOST_SIGN)
                    )) {
            	return true;
            }
            else {
            	return false;
            }
		}
    }

    private static class SimpleKeySelectorResult implements KeySelectorResult {
    	private PublicKey pk;
    	
    	SimpleKeySelectorResult(PublicKey pk) {
    		this.pk = pk;
    	}

    	public Key getKey() { 
    		return pk; 
    	}
    }
}

Отредактировано пользователем 30 июля 2012 г. 18:35:35(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 30 июля 2012 г. 19:44:25(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
Проверка с CSP тоже прошла.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.