升级到java7u25后,XML dig sig错误

kre*_*sok 20 java xml digital-signature

我有一个用于签署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 ...
Run Code Online (Sandbox Code Playgroud)

回到java7u21解决了这个问题.XML Dig Sig API中是否有任何更改导致此错误?

Cer*_*ber 35

同样的问题在这里 由于演变,似乎是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);
Run Code Online (Sandbox Code Playgroud)

在java 7u25中:

87: selectedElem = doc.getElementById(id);
    //...
93: if (secureValidation) {
Run Code Online (Sandbox Code Playgroud)

secureValidation指的是关于XML Sig验证的java 7u25演变(请参阅changelog),因此在处理此演变时,它们必须已经破坏 了其他内容.

我们通过提供定制的解决此问题的工作javax.xml.crypto.URIDereferencerjavax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)这是能够解决节点,其尚未在DOM文档树(在XMLObject组成片段).

我现在正在向Oracle报告这个问题,我将使用bug id更新答案.


编辑:apache SVN中找到了这个


编辑2:感谢这个错误报告,我明白这是XML"Id"属性处理的演变.

以前版本的java/JSR-105/SANTUARIO曾经对使用的"Id"属性非常宽容,document.getElementById(...)但是这个新版本需要一个标识为ID XML 的属性.我的意思是命名属性"Id"或"ID"不再足够,您需要将其标记为ID,最终通过XSD/DTD模式验证.

不幸的是,我正在遵循一个无效的架构,因此无法通过Java解析.

如果您处于相同的情况,请参阅下面的解决方案.否则,如果您的XML文档确实具有有效的架构,请查看@sherb解决方案/sf/answers/1220654361/

幸运的是,您可以使用类似的方法将属性标记为ID Element.setIdAttributeNode(org.w3c.dom.Attr,boolean).

结合一点XPath就像descendant-or-self::*/@Id获取Attr"Id"节点加上一点点Java一样((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)可以让你摆脱困境.

但要小心: setIdAttributeXXX()仅对当前文档和节点有效.如果你clone/ adopt/ import你需要setIdAttributeXXX()在每个DOM树的新节点上做一个


she*_*erb 10

我也发现对这个问题的回答很有帮助,但我的解决方案有点不同.我正在使用OpenSAML 2.6.0,并在解析传入文档之前为DocumentBuilderFactory分配模式,ResourceResolverException: Cannot resolve element with ID...通过正确标记ID属性来解决异常.这是一个例子:

InputStream in = new ByteArrayInputStream(assertion.getBytes());       
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new URL("http://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd"));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setSchema(schema);
Document document = factory.newDocumentBuilder().parse(in);
Run Code Online (Sandbox Code Playgroud)


小智 8

我对代码有同样的问题:

element.setAttributeNS(null, "Id", elementID);
Run Code Online (Sandbox Code Playgroud)

FIX: 指定id

element.setAttributeNS(null, "Id", elementID);
Attr idAttr = element.getAttributeNode("Id");
element.setIdAttributeNode(idAttr, true);
Run Code Online (Sandbox Code Playgroud)