首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xades4j - XML签名验证错误- SignaturePolicyNotAvailableException

Xades4j - XML签名验证错误- SignaturePolicyNotAvailableException
EN

Stack Overflow用户
提问于 2014-07-30 08:00:48
回答 1查看 1.3K关注 0票数 1

我收到带有Xades签名的XML发票,我必须控制它。所以我试着用Xades4j做这件事。我修正了很多错误,但我坚持错误:

代码语言:javascript
复制
errxades4j.verification.SignaturePolicyNotAvailableException: Verification failed for property 'SignaturePolicyIdentifier': signature policy document is not available
    at xades4j.verification.SignaturePolicyVerifier.verify(SignaturePolicyVerifier.java:67)
    at xades4j.verification.SignaturePolicyVerifier.verify(SignaturePolicyVerifier.java:38)
    at xades4j.verification.QualifyingPropertiesVerifierImpl.verifyProperties(QualifyingPropertiesVerifierImpl.java:58)
    at xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:202)

Java代码用于验证签名:

代码语言:javascript
复制
FileInputStream fis = new FileInputStream("keystore.jks");
KeyStore trustAnchors = KeyStore.getInstance("jks");
trustAnchors.load(fis,"password".toCharArray());
fis.close();

CertificateValidationProvider certValidator = new PKIXCertificateValidationProvider(trustAnchors, false);
XadesVerificationProfile p = new XadesVerificationProfile(certValidator);
XadesVerifier v = p.newVerifier();

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db =  dbf.newDocumentBuilder();
FileInputStream is = new FileInputStream(filename);
Document doc = db.parse(is);

Element sigElem = (Element)doc.getElementsByTagNameNS(Constants.SignatureSpecNS, Constants._TAG_SIGNATURE).item(0);
XAdESVerificationResult r = null;
r = v.verify(sigElem,null);

如果有必要的话,我可以在匿名之后发布一份XML文件的摘录。

谢谢。我已经查找并尝试了我所找到的一切(在网络上,xades4j示例,xades4j junit类.)但似乎什么也解决不了我的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 08:40:37

您需要指定您自己的策略文档提供程序,如:p.withPolicyDocumentProvider()。您还必须实现您自己的策略提供程序,它实现了SignaturePolicyInfoProviderSignaturePolicyDocumentProvider接口。(至少我是那样做的)

编辑您的评论:

您需要实现SignaturePolicyInfoProvider.getSignaturePolicyDocumentStream(),它返回一个InputStream。这可以是一个FileInputStream

示例

代码语言:javascript
复制
public class FilebasedSignaturePolicyProvider implements  SignaturePolicyDocumentProvider {

    @Override
    public InputStream getSignaturePolicyDocumentStream(ObjectIdentifier sigPolicyId) {
        String oid = sigPolicyId.getIdentifier();

        try {
            return new FileInputStream("directory-to-my-policy-files/" + oid);
        } catch (FileNotFoundException e) {
            // handle error
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25031633

复制
相关文章

相似问题

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