sígueme ...

    Múltiples firmas enveloped en un documento XML Signature

    Según la especificación del estándar XML Signature del W3C, las firmas “enveloped” son aquellas que están embebidas en los datos originales, de forma que son capaces de excluir su contenido a la hora de verificar el documento original.

    Destacan por tener siempre definida una referencia (Reference), con el valor establecido del atributo URI a cadena vacia:

    <Reference URI="">
    <Transforms>
    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
    <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
    <DigestValue></DigestValue>
    </Reference>

    Ejemplo de una firma “enveloped”:

    El problema es que cuando tenemos más de una firma de este tipo en un mismo documento, es necesario que cada una se excluya a si misma y a las demás firmas a la hora de calcular cualquier digest. Con la transformación “enveloped”, sólo se elimina la propia referencia, quedando en el documento el resto de firmas y haciendo que los cálculos de los digest sean incorrectos.

    Para resolver este problema, debemos utilizar XPath Filtering.

    Según la especificación, el filtrado XPath en una transformación que nos permite quedarnos con el conjunto de nodos necesario para poder calcular de forma correcta la firma.

    En nuestro caso, sustituyendo la transformación “enveloped” por un correcto filtrado, podemos soportar múltiples firmas “enveloped” en un mismo documento:

    <Reference URI="">
    <Transforms>
    <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
    <XPath xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    not(ancestor-or-self::dsig:Signature)
    </XPath>
    </Transform>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <DigestValue></DigestValue>
    </Reference>

    Si estamos desarrollando en Java, podemos generar este tipo de referencia de la siguiente forma:

    Transform transform = fac.newTransform(Transform.XPATH, new XPathFilterParameterSpec(
    "not(ancestor-or-self::dsig:Signature)", Collections.singletonMap("dsig", XMLSignature.XMLNS)));
    Reference ref = fac.newReference("", fac.newDigestMethod(DigestMethod.SHA1, null),
    Collections.singletonList(transform), null, null);

    Crea tus facturas electrónicas de forma sencilla y gratuita

    “Hazte una Facturae” es un nuevo servicio disponible de forma gratuita y que permite realizar la emisión y firma digital de facturas en formato Facturae 3.1, generando adicionalmente una visualización de la misma en formato PDF.

    Gracias a este servicio, las empresas pequeñas que tienen un volumen de facturación reducido, pueden emitir sus facturas electrónicas sin necesidad de adquirir un sotware especializado de facturación.

    Como aspecto a reseñar, las facturas emitidas por este servicio validan perfectamente contra el servicio de validación que ofrece el Ministerio de Economía y Hacienda.