XML dig sig错误升级到java7u25后
我有一个用于签署XML文档的Java应用程序。将Java升级到最新版本(Java7u25)后,它将停止工作。我收到以下错误:
javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID ... 回到java7u21解决问题。 XML Dig Sig API是否有任何改变导致此错误?
同样的问题在这里由于演进,JVM似乎是一个bug。
我已经把它调到了com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment 在java 7u21&之前: 91: // Element selectedElem = doc.getElementById(id); 92: selectedElem = IdResolver.getElementById(doc,id); 在java 7u25: 87: selectedElem = doc.getElementById(id); //... 93: if (secureValidation) { secureValidation是指Java Sig验证的Java 7u25演进(见changelog),所以在进行这一演变的同时,他们必须已经破坏了其他的东西。 我们已经解决了这个问题,提供了一个自定义javax.xml.crypto.URIDereferencer到javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer),它能够解析尚未在DOM文档树中的节点(片段在XMLObject中)。 我现在向Oracle报告这个问题,我会用错误ID更新答案。 编辑:在apache SVN发现 编辑2:感谢this bug report我已经明白,这是XML“Id”属性处理中的演变。 以前版本的java / JSR-105 / SANTUARIO过去对document.getElementById(…)中使用的“Id”属性非常宽容,但是这个新版本需要一个标识为ID XML的属性。我的意思是命名属性“Id”或“ID”不够,您需要将其标记为ID,最终通过XSD / DTD模式验证。 不幸的是,我遵循一个无效的模式,因此不能被Java解析。 如果您处于同一情况,请参阅我的解决方案。否则,如果您的XML文档确实有一个有效的模式,请查看@sherb solution http://stackoverflow.com/a/17437919/233906 解 幸运的是,您可以使用像 结合一些XPath,如descendant-or-self :: * / @ Id来获取Attr“Id”节点加上一些Java((Element)attr.getParentNode())。setIdAttributeNode(attr,true)应该让你离开麻烦。 但要小心:setIdAttributeXXX()仅对当前文档&节点。如果克隆/采用/导入,则需要在每个DOM树的新节点上执行setIdAttributeXXX() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |