Ошибка подписи образца XML с использованием Xades4J: ReferenceNotInitializedException: не удается разрешить элемент с идентификатором - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь подписать простое XML, используя Xades4J, используя этот пример, но я получил эту ошибку:

Исключение в потоке "main" xades4j.XAdES4jXMLSigException :
Невозможно разрешить элемент с идентификатором
в xades4j.production.SignerBES.sign (SignerBES. java: 277)
в xades4j.production.SignerBES.sign (SignerBES. java: 130)
at xmlSigner.Main.main (Main. java: 63)
Вызвано: org. apache. xml .security.signature.ReferenceNotInitializedException: Невозможно разрешить элемент с идентификатором
Исходное исключение было org. apache. xml .security.utils.resolver.ResourceResolverException: невозможно разрешить элемент с идентификатором
в org. apache. xml .security.signature.Reference.getContentsBeforeTransformation (Reference. java). : 437)
в организации. apache. xml .security.signature.Reference.calculateDigest (Ссылка. java: 722)
в организации. apache. xml .security.signature .Reference.generateDigestValue (Ссылка. java: 414)
в организации. apache. xml .security.signature.Mani fest.generateDigestValues ​​(Манифест. java: 205)
в орг. apache. xml .security.signature.XMLSignature.sign (XMLSignature. java: 628)
в xades4j.production. SignerBES.sign (SignerBES. java: 273)
... еще 2
Причина: org. apache. xml .security.utils.resolver.ResourceResolverException: Не удается разрешить элемент с идентификатором в org. apache. xml .security.utils.resolver.implementations.ResolverFragment.engineResolveURI (ResolverFragment. java: 81) в org. apache. xml .security.utils.resolver.ResourceResolver.resolve (ResourceResolver. java: 288) в орг. apache. xml .security.signature.Reference.getContentsBeforeTransformation (Reference. java: 435) ... еще 7

Мой код такой:

package xmlSigner;
import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import xades4j.algorithms.EnvelopedSignatureTransform;
import xades4j.production.DataObjectReference;
import xades4j.production.SignedDataObjects;
import xades4j.production.XadesBesSigningProfile;
import xades4j.production.XadesSigner;
import xades4j.properties.DataObjectDesc;
import xades4j.providers.KeyingDataProvider;
import xades4j.providers.impl.FileSystemKeyStoreKeyingDataProvider;
import xades4j.providers.impl.DirectPasswordProvider;
import xades4j.providers.impl.FirstCertificateSelector;
import xades4j.utils.DOMHelper;

public class Main {

        private static final String CERT_FOLDER = "C:\\Users\\...";
        private static final String CERT        = "keystore.p12";
        //private static final String KEY_STORE   = "KeyStorage";
        private static final String PASS        = "mypass"; //the same in cert and keystorage

        //private static final String TSA_URL     = "http://XXX.XXX.XXX/ts.inx";
        //private static final String TSA_USER    = "XXXXXXXX";
        //private static final String TSA_PASS    = "XXXXXXXX";

        //private static final String UNSIGNED    = "C:/Test/sign-verify/unsigned.xml";
        private static final String SIGNED      = "C:\\Users\\...\\FLUSSO_A_signed.xml";
        //private static final String SIGNEDT     = "C:/Test/sign-verify/signed-t-bes.xml";    
        //private static final String VERIFY      = "C:/Test/sign-verify/verify-bes.txt";
        //private static final String VERIFYT     = "C:/Test/sign-verify/verify-t-bes.txt";
        private static final String DOCUMENT    = "C:\\Users\\..\\FLUSSO_A.xml";
        //private static final String DOCSIGNED   = "C:/Test/sign-verify/signed.bes.xml";

        public static void main(String[] args) throws Exception {

            Document doc = DocumentBuilderFactory
                    .newInstance()
                    .newDocumentBuilder()
                    .parse(new File(DOCUMENT));
            Element elem = doc.getDocumentElement();
            DOMHelper.useIdAsXmlId(elem);


            KeyingDataProvider kdp = new FileSystemKeyStoreKeyingDataProvider(
                    "pkcs12",
                    CERT_FOLDER + CERT,
                    new FirstCertificateSelector(),
                    new DirectPasswordProvider(PASS),
                    new DirectPasswordProvider(PASS),
                    true);
            // here I tried also EManifest (the XML root tag) and name (since elem has a "name" attribute)
            DataObjectDesc obj = new DataObjectReference("#" + elem.getAttribute("Id")) 
                    .withTransform(new EnvelopedSignatureTransform());
            SignedDataObjects dataObjs = new SignedDataObjects().withSignedDataObject(obj);

            XadesSigner signer = new XadesBesSigningProfile(kdp).newSigner();
            signer.sign(dataObjs, elem); // fails here

            /*TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            DOMSource source = new DOMSource(doc);        
            StreamResult result = new StreamResult(new File(SIGNED));
            transformer.transform(source, result);*/
        }
    }

XML является примером документа для таможенных процессов и может быть найден здесь .
Любой совет будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 апреля 2020

Я нашел решение. Тег root моего XML выглядит следующим образом

<EManifest xmlns="http://www.iso.org/28005-ITA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.iso.org/28005-ITA">

, добавление атрибута в тег (в частности, Id="test") решило проблему.

Теперь мой тег root выглядит следующим образом

<EManifest xmlns="http://www.iso.org/28005-ITA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.iso.org/28005-ITA" Id="test">
...