with - Error de dig dig XML después de actualizar a java7u25
validar firma xml java (6)
El mismo problema aqui. Parece ser un error dentro de la JVM debido a una evolución.
Lo he rastreado hasta com.sun.org.apache.xml.internal.security.utils.resolver.implementations.ResolverFragment
En java 7u21 y antes:
91: // Element selectedElem = doc.getElementById(id);
92: selectedElem = IdResolver.getElementById(doc, id);
En java 7u25:
87: selectedElem = doc.getElementById(id);
//...
93: if (secureValidation) {
secureValidation
refiere a la evolución de Java 7u25 en la validación de XML Sig (ver changelog ) por lo que deben haber cambiado otra cosa mientras trabajaban en esta evolución.
Hemos solucionado este problema proporcionando un javax.xml.crypto.URIDereferencer
personalizado a javax.xml.crypto.dom.DOMCryptoContext.setURIDereferencer(URIDereferencer)
que puede resolver el nodo que aún no está en el árbol de documentos DOM (fragmentos) en XMLObject).
Estoy reportando esto a Oracle ahora mismo, actualizaré la respuesta con la identificación del error.
EDITAR: encontré esto en apache SVN
Edit 2: Gracias a este informe de error, entendí que se trataba de una evolución en el manejo de atributos de "Id" de XML.
Las versiones anteriores de java / JSR-105 / SANTUARIO solían ser muy tolerantes con los atributos "Id" usados en document.getElementById(...)
pero esta nueva versión requiere un atributo que se identifica como ID XML hablando. Quiero decir que nombrar el atributo "Id" o "ID" ya no es suficiente, debe marcarlo como ID, eventualmente mediante una validación de esquema XSD / DTD.
Por fortuna, estoy siguiendo un esquema que no es válido y, por lo tanto, no es analizable por Java.
Si se encuentra en la misma situación, vea mi solución a continuación. De lo contrario, si su documento XML tiene un esquema válido, eche un vistazo a la solución @sherb https://stackoverflow.com/a/17437919/233906
Solución
Afortunadamente, puede etiquetar un atributo como una ID utilizando métodos como Element.setIdAttributeNode(org.w3c.dom.Attr,boolean)
.
Combinando con un pequeño XPath como descendant-or-self::*/@Id
para obtener los nodos "Id" de Attr
más un poco de Java ((Element)attr.getOwnerElement()).setIdAttributeNode(attr,true)
debería sacarlo de problema.
Pero tenga cuidado: setIdAttributeXXX()
es válido solo para el documento y nodo actuales. Si clone
/ adopt
/ import
, necesita hacer un setIdAttributeXXX()
en los nuevos nodos de cada árbol DOM
Tengo una aplicación Java para firmar documentos XML. Después de actualizar Java a la última versión (Java7u25), deja de funcionar. Obtuve el siguiente error:
javax.xml.crypto.dsig.XMLSignatureException:
javax.xml.crypto.URIReferenceException:
com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException:
Cannot resolve element with ID ...
Volver a java7u21 resuelve el problema. ¿Hay algún cambio en la API de XML Sig Sig que cause este error?
Estoy enfrentando el mismo problema solo cuando el ID se establece con UUID aleatorio [ guidForSignature ="_" + UUID.randomUUID().toString();
] y cuando hay solicitudes simultáneas activadas en tiempo de ejecución (Java 1.8).
He intentado establecer el atributo de ID como abajo que no me ayudó. Sin embargo, la configuración del atributo ID en el valor de ID constante para todas las solicitudes resolvió el problema.
Element element1= doc.getDocumentElement().setIdAttribute("ID", true);
O
Element e1 =(Element)doc.getElementsByTagName("Assertion").item(0);
e1.setIdAttribute("ID", true);
Me enfrenté al mismo problema y también lo localicé en los fragmentos de código mencionados por Cerber. Tengo curiosidad por si esto es un error o un cambio hecho a propósito.
Con la información proporcionada en este hilo Java XML DOM: ¿cómo son especiales los atributos de id? Pude hacer que las cosas volvieran a funcionar.
En pocas palabras, el atributo ''ID'' tiene que ser del tipo ''xs: ID'' (y no, por ejemplo, ''xs: string'') para que el Dereferencer lo encuentre. También tenga en cuenta que, dependiendo de su uso de DocumentBuilderFactory, el esquema XML debe estar configurado.
Si usted tiene
dsObjectChild.setAttribute("Id", "My-id-value");
Cambiarlo a
dsObjectChild.setAttribute("Id", "My-id-value");
dsObjectChild.setIdAttribute("Id", true);
Está trabajando con java 1.7.0_45
También encontré las respuestas a esta pregunta bastante útiles, pero mi solución fue un poco diferente. Estoy trabajando con OpenSAML 2.6.0 y asignando un esquema a DocumentBuilderFactory justo antes de analizar el documento entrante se resolvió la excepción ResourceResolverException: Cannot resolve element with ID...
marcando correctamente los atributos de ID. Aquí hay un ejemplo:
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);
Tuve el mismo problema con el código:
element.setAttributeNS(null, "Id", elementID);
FIX: especificar id
element.setAttributeNS(null, "Id", elementID);
Attr idAttr = element.getAttributeNode("Id");
element.setIdAttributeNode(idAttr, true);