Pregunta

Este es mi documento xml.Quiero firmar solo la parte del ID de usuario usando la firma xml.Estoy usando la transformación xpath para seleccionar ese elemento en particular.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
Version="2.0" IssueInstant="2012-05-22T13:40:52:390" ProtocolBinding="urn:oasis:na
mes:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="localhos
t:8080/consumer.jsp">
<UserID>
   xyz
</UserID>
<testing>
   text
</testing>
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
   http://localhost:8080/saml/SProvider.jsp
</saml:Issuer>
</samlp:AuthnRequest>


Estoy usando el siguiente código para agregar las transformaciones:

transformList.add(exc14nTransform);
 transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"")));


Pero me sale lo siguiente:

Original Exception was javax.xml.transform.TransformerException: Extra illegal t
okens: 'xmlns', ':', 'samlp', '=', '"urn:oasis:names:tc:SAML:2.0:protocol"'


Entonces, intenté eliminar la parte xmlns.

transformList.add(fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec("samlp:AuthnRequest/UserID")));


Pero firma todo el documento y da el siguiente mensaje:

com.sun.org.apache.xml.internal.security.utils.CachedXPa
thFuncHereAPI fixupFunctionTable
INFO: Registering Here function


¿Cuál es el problema?
EDITAR
Como dijo @Jörn Horstmann, el mensaje es solo un registro o algo así.Ahora el problema es que incluso después de realizar la consulta xpath, se firma todo el documento en lugar de solo el ID de usuario.Confirmé esto cambiando el valor de <testing>elemento después de firmar el documento.El resultado es que el documento no se valida (si firmó solo la parte de ID de usuario, cualquier cambio realizado en <testing> debería resultar en una firma válida).

¿Fue útil?

Solución

Esta no es una expresión xpath válida, no hay forma de declarar el prefijo de espacio de nombres dentro de la expresión.

samlp:AuthnRequest/UserID xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"

Especificación de parámetro de filtro XPath tiene otro constructor que permite especificar un mapeo de prefijos de espacios de nombres, puedes probar la siguiente expresión:

new XPathFilterParameterSpec("samlp:AuthnRequest/UserID",
    Collections.singletonMap("samlp", "urn:oasis:names:tc:SAML:2.0:protocol"))

Editar:

El mensaje no parece ser un error, ver línea 426 aquí, su nivel de registro probablemente debería ser inferior a INFO.

También eché un vistazo a descripción del filtrado xpath:

La expresión XPath que aparece en el parámetro XPath se evalúa una vez para cada nodo en el conjunto de nodos de entrada.El resultado se convierte a booleano.Si el valor booleano es verdadero, entonces el nodo se incluye en el conjunto de nodos de salida.Si el booleano es falso, entonces el nodo se omite del conjunto de nodos de salida.

Entonces, la expresión xpath correcta para incluir solo el UserID en la firma estaría self::UserID.Pero no me pregunten si esto realmente tiene sentido para una firma xml.El ejemplo en la especificación parece usar una expresión xpath para incluir todo excepto el elemento de firma en sí:

not(ancestor-or-self::dsig:Signature)

Edición 2:

La expresión correcta es en realidad ancestor-or-self::UserID ya que el filtro también tiene que incluir los nodos secundarios de texto del UserID nodo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top