我有一个用于签署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内部的错误。

我已经将其追溯到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指的是XML Sig验证上的Java 7u25演化(请参阅changelog),因此在进行这种演化时,他们必须将 splinter 的更改为

我们通过为javax.xml.crypto.URIDereferencer提供自定义javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)来解决此问题,该自定义document.getElementById(...)能够解析尚未在DOM文档树(XMLObject中的片段)中的节点。

我现在正在将此报告给Oracle,我将用错误ID更新答案。

编辑:apache SVN中找到了此

编辑2:感谢this bug report,我了解这是XML“Id”属性处理的一个发展。

以前的Java/JSR-105/SANTUARIO以前版本对Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)中使用的“Id”属性非常宽容,但是此新版本需要一个标识为的属性,该属性标识为 XML。我的意思是,仅命名属性“Id”或“ID”已经不够,您最终需要通过XSD/DTD模式验证将其标记为ID,即

不幸的是,我遵循的模式无效,因此不能被Java解析。

如果您的情况相同,请在下面查看我的解决方案。否则,如果您的XML文档确实具有有效的架构,请查看@sherb解决方案https://stackoverflow.com/a/17437919/233906



幸运的是,您可以使用 descendant-or-self::*/@Id 之类的方法将属性标记为ID。

Attr之类的XPath一起获取((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)“Id”节点,再加上Java setIdAttributeXXX(),这会让您摆脱麻烦。

但要小心: clone仅对当前文档和节点有效。如果您使用adopt/import/setIdAttributeXXX(),则需要在每个DOM树的新节点上执行ojit_code

关于java - 升级到java7u25后出现XML dig sig错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17331187/

10-14 10:56
查看更多