验证签名 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
我需要验证签名 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