【问题标题】:Xades4j - XML Signature Verification error - SignaturePolicyNotAvailableExceptionXades4j - XML 签名验证错误 - SignaturePolicyNotAvailableException
【发布时间】:2014-07-30 08:00:48
【问题描述】:

我收到带有 Xades EPES 签名的 XML 发票,我必须控制它。 所以我尝试用 Xades4j 做到这一点。我已经修复了很多错误但我坚持错误:

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代码:

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 类......)但似乎没有任何东西可以解决我的错误。

【问题讨论】:

    标签: java xml verifyerror xades4j


    【解决方案1】:

    您需要像这样指定自己的保单文档提供者:p.withPolicyDocumentProvider()。 你必须实现你自己的策略提供者来实现接口SignaturePolicyInfoProviderSignaturePolicyDocumentProvider。 (至少我是这样做的)

    编辑您的评论:

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

    示例

    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
            }
        }
    }
    

    【讨论】:

    • 非常感谢。是的,您对 EPES 的权利似乎我们需要设置 PolicyDocumentProvider。不幸的是,我不明白如何设置自己的策略提供者。我正在寻找 xades4j 示例 XadesVerifierImplTest... 我没有找到任何好的文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多