验证签名 XADES throw java.lang.ArrayIndexOutOfBoundsException: 0

Verify Signature XADES throw java.lang.ArrayIndexOutOfBoundsException: 0

我需要验证签名 xml 文件中的签名 XADES。我使用 xades4j v.1.4.0 但是当调用方法验证时抛出 java.lang.ArrayIndexOutOfBoundsException: 0。 一些文件工作,另一个没有。

我在调试模式下尝试过,在方法 checkForm -XAdESFormChecker 中抛出异常 class。

我的代码:

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                dbf.setNamespaceAware(true);
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document doc = db.parse(inputStream);
                DOMHelper.useIdAsXmlId(doc.getDocumentElement());                    
                NodeList nList = doc.getElementsByTagName("ds:Signature");
                Element elem = null;                      
                for (int temp = 0; temp < nList.getLength(); temp++) {
                    Node nNode = nList.item(temp);
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        elem = (Element) nNode;
                        elem.setIdAttributeNS(null, "Id", true);
                    }
                }
                data = item.getData();               
                CertificateValidationProvider certValidator = new CertificateValidationProviderImpl();
                XadesVerificationProfile p = new XadesVerificationProfile(certValidator);
                XadesVerifier v = p.newVerifier();
                SignatureSpecificVerificationOptions opts = new SignatureSpecificVerificationOptions().useDataForAnonymousReference(data);   
                XAdESVerificationResult result = v.verify(elem, opts);

签名:Xml signature

你能帮帮我吗? 错误是什么?


编辑 - 堆栈跟踪

*java.lang.ArrayIndexOutOfBoundsException: 0 在 xades4j.verification.XAdESFormChecker$XAdESFormDesc.getPrevious(XAdESFormChecker.java:109) 在 xades4j.verification.XAdESFormChecker.checkForm(XAdESFormChecker.java:55) 在 xades4j.verification.XadesVerifierImpl.verify(XadesVerifierImpl.java:213) 在 it.yyy.kkkFramework.albo.InserimentoRichiestaController.listenerUploadDoc(InserimentoRichiestaController.java:1811) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.sun.el.parser.AstValue.invoke(AstValue.java:187) 在 com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) 在 com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 在 org.richfaces.event.MethodExpressionEventListener.processEvent(MethodExpressionEventListener.java:125) 在 org.richfaces.view.facelets.FileUploadHandler$FileUploadListenerImpl.processFileUpload(FileUploadHandler.java:55) ...

xades4j 基于 ETSI TS 101 903 (XAdES 1.4.1)。但是,您的签名包含 SigningCertificateV2,这是在较新的 XAdES 规范中定义的 属性,xades4j 尚不支持。这是导致错误的原因,因为 SigningCertificate 属性 不存在。

库不应抛出 "array out of bounds" 异常(这将被修复,因为它是一个错误),但它无法验证签名。如果不是因为这个错误,你会看到在这一行中抛出更明显的异常:https://github.com/luisgoncalves/xades4j/blob/master/src/main/java/xades4j/verification/XAdESFormChecker.java#L64