Pregunta

Tengo un documento XML. Estoy firmando una parte del documento utilizando XMLSignature.Antes de encontrar digest, quiero aplicar XSLT Transforme.

Según lo que leí, XSLT convierte un documento XML a otro formato (también puede ser XML). Ahora estoy confundido que,
¿Dónde será el nuevo documento transformado?

Cómo recuperar el valor de este documento recién creado si quiero¿Para mostrarlo al usuario?

mi documento XML

<r1>
 <user>asd</user>
 <person>ghi</person>
</r1>

Código para la transformación

Transform t=fac.newTransform(Transform.XPATH,new XPathFilterParameterSpec("/r1/user"));

De acuerdo con la transformación de XPATH, siempre que cambie el valor del elemento de usuario, no se debe validar la XMLSignature.Y si el valor del elemento de la persona cambia, entonces la firma debe validarse.Pero cuando cambio el valor del elemento de la persona, la firma no está validada.¿Por qué?

¿Fue útil?

Solución

La transformada XSLT utilizada al firmar un documento se refiere a cómo se seleccionan los nodos en su fuente XML cuando se calcula la firma.

esta pregunta / respuesta por Dave se relaciona con la firma de partes de un documento XML usando XPATH2. The enlace A SEAN MulLans 'Post En esta respuesta sugiere que Xpath2 es más apropiado para firmar partes de un documento porque la evaluación de una expresión xpath se realiza por nodo.

Sobre la base de la Sun DSIG Ejemplo Puede reemplazar la referencia creación usando:

List<XPathType> xpaths = new ArrayList<XPathType>();
xpaths.add(new XPathType("//r1/user", XPathType.Filter.INTERSECT));

Reference ref = fac.newReference
  ("", fac.newDigestMethod(DigestMethod.SHA1, null),
        Collections.singletonList
          (fac.newTransform(Transform.XPATH2, 
                  new XPathFilter2ParameterSpec(xpaths))),
             null, null); 

Esto permite que // r1 / usuario estén protegido con una firma mientras se puede alterar el resto del documento.

El problema con la selección XPATH / XPATH2 es que se puede generar una firma para / algunos / nodo / eso / no / no / no existen . Tienes derecho a modificar un documento de prueba y asegurarte de que la firma esté funcionando de la forma en que espera.

Puede probar el documento en un programa de prueba generando una firma y luego manipulando con el nodo XML antes de la verificación:

NodeList nlt = doc.getElementsByTagName("user");
nlt.item(0).getFirstChild().setTextContent("Something else");


Una alternativa más confiable a un selector XPATH podría ser poner una identificación en los elementos de documento XML que espera firmar como:

<r1>
 <user id="sign1">asd</user>
 <person>ghi</person>
</r1>

Luego haga referencia a este ID como el URI en el primer parámetro de una transferencia envuelta:

Reference ref = fac.newReference
  ("#sign1", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList
      (fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null)),
          null, null); 


Para la salida, una operación de firma agrega un nuevo elemento de firma a la DOM que ha cargado en la memoria. Puede transmitir la salida transformándola así:

TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.setOutputProperty(OutputKeys.INDENT, "yes");

trans.transform(new DOMSource(doc), new StreamResult(System.out)); 

Otros consejos

La especificación XSLT no define lo que sucede con el documento de resultado;Eso está definido por las especificaciones API de su procesador XSLT elegido.Por ejemplo, si invoca a XSLT desde Java utilizando la interfaz JAXP, puede solicitar el resultado como un árbol DOM en la memoria o para que sean serializados en un archivo específico en el disco.

Usted ha etiquetado su pregunta "Java", que es la única pista que le da a su entorno de procesamiento.Mi conjetura es que desea transformar a un DOM y luego usar las interfaces DOM para obtener el valor del nuevo documento.Sin embargo, si está utilizando XSLT 2.0 y SAXON, la interfaz S9API es mucho más utilizable que la interfaz de JAXP nativa.

La parte XSLT define solo la definición de transformación, nada más. Echa un vistazo a esto:

Tutorial Java XSLT

En Francois Gravel Respuesta El archivo de input.xml es el archivo que se transformará, el TRANSFORM.XSLT es la definición XSLT que describe cómo transformar el archivo XML.Salida. Los resultados son los resultados, esto puede ser XML, pero también puede ser HTML, archivo plano ...

Aquí es donde empecé cuando estaba usando XSLT:

http://www.w3schools.com/xsl/default.asp

Eche un vistazo a esto también:

http://www.w3schools.com/xsl/tryxslt.asp? xmlfile= cdcatalog & xsltfile= cdcatalog

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