首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用XADES4j验证XADES签名

用XADES4j验证XADES签名
EN

Stack Overflow用户
提问于 2014-12-05 10:28:38
回答 1查看 3.7K关注 0票数 3

我们希望创建一个验证"XADES“签名的java web应用程序,这个应用程序应该包含两个文件:原始文件和他独立的签名。

我正在使用XADES4j库,这是一个很棒的项目。有了XADES4j,是否有一种方法可以验证签名而不验证URI文件的引用?因为无法访问xml签名中的给定引用文件。

作为参考验证:我希望比较从给定的原始文件中计算出来的摘要值和从签名文件中提取的digestValue。

这是个例外

代码语言:javascript
复制
Exception in thread "main" xades4j.XAdES4jXMLSigException: Error verifying the signature
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:285)
    at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:188)
    at com.wct.VerifyXades.main(VerifyXades.java:33)
Caused by: org.apache.xml.security.signature.MissingResourceFailureException: The Reference for URI file:/D:/workspace/xades4j-487d7a9bb9e5/data_to_sign/test.txt has no XMLSignatureInput
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was org.apache.xml.security.utils.resolver.ResourceResolverException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
Original Exception was java.io.FileNotFoundException: D:\workspace\xades4j-487d7a9bb9e5\data_to_sign\test.txt (Le fichier spécifié est introuvable)
    at org.apache.xml.security.signature.Manifest.verifyReferences(Manifest.java:412)
    at org.apache.xml.security.signature.SignedInfo.verify(SignedInfo.java:256)
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:764)
    at org.apache.xml.security.signature.XMLSignature.checkSignatureValue(XMLSignature.java:696)
    at xades4j.verification.XadesVerifierImpl.doCoreVerification(XadesVerifierImpl.java:278)
    ... 2 more

下面是我用来验证XADES签名的源代码:

代码语言:javascript
复制
package com.wct;

import java.io.FileInputStream;
import java.security.cert.X509CertSelector;
import java.security.cert.X509Certificate;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import xades4j.providers.CertificateValidationException;
import xades4j.providers.CertificateValidationProvider;
import xades4j.providers.ValidationData;
import xades4j.verification.UnexpectedJCAException;
import xades4j.verification.XAdESVerificationResult;
import xades4j.verification.XadesVerificationProfile;
import xades4j.verification.XadesVerifier;

public class VerifyXades {

    public static void main(String[] args) throws Exception {
        CertificateValidationProvider certValidator = new CertificateValidationProviderImpl();
        XadesVerificationProfile p = new XadesVerificationProfile(certValidator);
        p.acceptUnknownProperties(true);
        XadesVerifier v = p.newVerifier();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new FileInputStream("data_signed/detachedTestSignature.xml"));
        XAdESVerificationResult vr = v.verify(doc.getDocumentElement(), null);
    }
}

class CertificateValidationProviderImpl implements CertificateValidationProvider {
    @Override
    public ValidationData validate(X509CertSelector certSelector,
            Date validationDate, Collection<X509Certificate> otherCerts)
            throws CertificateValidationException, UnexpectedJCAException {
        return new ValidationData((List<X509Certificate>) otherCerts);
    }
}

我是新的签名/验证开发,我没有良好的经验。请帮帮忙

提前感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2014-12-08 22:02:22

你不应该对任何东西做摘要比较。必须以某种方式访问该文件,以便可以将引用作为签名验证的一部分进行检查。

你控制签名生成吗?如果是这样的话,您应该更改相对URI的URI,或者使用匿名引用(下面有更多信息)。无论如何,您的所有选项都将基于SignatureSpecificVerificationOptions

如果可以更改签名验证:

  • 在引用上使用一个相对文件uri,并在签名生产验证上指定一个基URI。有一些关于xades4j测试的例子。
  • 使用匿名引用(没有URI属性),并在签名产品上使用AnonymousDataObjectReference指定数据,并在验证上指定相应的输入。

如果无法更改签名产品:

  • 处理文件URI并从中返回文件数据的注册自定义ResourceResolver。已经有Apache Santuario上的文件URI解析器 (由xades4j使用),但是自定义解析器有优先权。这是一种解决办法..。拥有这些绝对文件URI签名很可能会导致您所遇到的问题。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27313789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档