微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xades4j 生成的文件无效XAdES-BES 封装

如何解决xades4j 生成的文件无效XAdES-BES 封装

我需要用 XAdES-BES 封装的 xml 文件签名。问题是签名似乎无效。

环顾四周,我找到了我正在使用这个测试用例的代码

import org.apache.commons.io.FileUtils;

import org.junit.Assert;
import org.junit.Test;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import systems.software.red.cedi5.aidaSignature.AidaSignatureService;
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.KeyStoreKeyingDataProvider;
import xades4j.utils.DOMHelper;

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 java.io.File;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.util.List;

public class TestSignature  {

    public class FirstCertificateSelector implements KeyStoreKeyingDataProvider.SigningCertSelector
    {
        @Override
        public X509Certificate selectCertificate(
                List<X509Certificate> availableCertificates)
        {
            return availableCertificates.get(0);
        }
    }

    public class DirectPasswordProvider implements KeyStoreKeyingDataProvider.KeyStorePasswordProvider,KeyStoreKeyingDataProvider.KeyEntryPasswordProvider
    {
        private char[] password;

        public DirectPasswordProvider(String password)
        {
            this.password = password.tochararray();
        }

        @Override
        public char[] getpassword()
        {
            return password;
        }

        @Override
        public char[] getpassword(String entryAlias,X509Certificate entryCert)
        {
            return password;
        }
    }



    @Test
    public void signBes(String resourceName,String outputPath,String keystorePath,String keystorePwd) throws Exception {
        try (InputStream DocumentIs = TestSignature.class.getResourceAsstream(resourceName)) {
            Document doc = DocumentBuilderFactory
                    .newInstance()
                    .newDocumentBuilder()
                    .parse(DocumentIs);
            Element elem = doc.getDocumentElement();
            DOMHelper.useIdAsXmlId(elem);


            KeyingDataProvider kdp = new FileSystemKeyStoreKeyingDataProvider(
                    "pkcs12",keystorePath,new FirstCertificateSelector(),new DirectPasswordProvider(keystorePwd),true);
            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);

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

    @Test
    public void testSign_8D4U0506_M000010_xml() throws Exception {
        signBes("/sample.xml","/tmp/sample-signed.xml","/home/foo/signature.p12","mypwd");
    }
}

/tmp/sample-signed.xml 似乎无效。

我还尝试在此处验证签名文件http://tools.chilkat.io/xmlDsigVerify.cshtml,但结果是:

Signature is Invalid
Number of Reference Digests = 2
Reference 1 digest is valid.
Reference 2 digest is invalid because the computed digest differs from the digest in the XML.

我需要使用 XAdES-BES enveloped 签署 xml 文件,但我不知道如何继续。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?