Bienvenido a Facturas y Respuestas.

Esperamos que encuentre la respuesta a su pregunta. Y si no, puede formularla para que los expertos de la comunidad la respondan.

Preguntar

Este blog es creado y administrado por:

Copyright - 2020

0 votos
por en Firma digital

Buenos dias

El inconveniente que tengo es que no sé como generar la infomacion de ds:SignedInfo, la cual tiene varios campos los cuales entiendo que se generan a partir del XML, ya lo genero completo con el cufe, InvoiceLines y LegalMonetaryTotal, la cosa es que en la documentacion está para JAVA, con la libreria de xades4j, pero no sé si puedo firmarlo manualmente, con alguna libreria comparable en node, y establecer los valores que me entrega en los campos requeridos, tampoco se si se firma con el xml sin la extension ds:Signature, ya tengo el certificado .p12 de una entidad certificada por la ONAC, como comenté el lenguaje que trabajo es node.js, genero el xml con node-xml

por
Hola, pudiste revolverlo usando únicamente nodejs? Uso xadesjs pero la DIAN me dice que no pudo verificar la firma

2 Respuestas

0 votos
por

En signedInfo tienes que generar 3 referencias.

  • 1. Referencia al documento XML,
  • 2. Referencia al certificado. 
  • 3. Referencia a la etiqueta SignedProperties. 

Mas info:
https://www.w3.org/TR/xmldsig-core2/
https://www.w3.org/TR/XAdES/
https://www.etsi.org/deliver/etsi_en/319100_319199/31913201/01.01.00_30/en_31913201v010100v.pdf
https://www.youtube.com/watch?v=Jza9i4gDeAE  

por
Creo que los videos de youtube eran justo lo que necesitaba, no entiendo exactamente que se debe firmar o que quitarle al xml antes de firmarlo, muchas gracias por tu respuesta!
por
Hey amigo, ¿Pudiste resolverlo? Estoy generando la firma con xadesjs pero la DIAN retorna "Regla: SIGNPLGNS, Rechazo: No se pudo validar firma."
0 votos
por
Se hace con xadesjs, la verdad es que no importa el lenguaje, esa firma es un estandard asi que lo que yo hice fue leer la documentacion de dicho estandard y compararlo con una factura valida (ve a tu correo y mira alguna factura que te hayan enviando al comprar algo, descomprimerla y dentro del attached docuemet debe estar la factura como CDATA, luego analiza los campos que tiene la firma, ahi estan: las referencias, la politica, el role...

Ya con eso el estandard "toma forma" y se te hace mas entendible la documentacion de XADESJS porque seamos sinceros, si nunca hemos firmado un documentos xml, cualquier documentacion de firma (sea la libreria que sea) parece chino... y xades va a parecer aun mas intrincado...

voy a compartir como se ve el objeto de configuracion de la firma con xadesjs para que se hagan a una idea, no lo comparto todo por temas legales:

```

const signature = await xadesXml.Sign(
            alg,
            privateKey,
            xmlDoc,
            {
                x509: signingCertificates,
                references: [
                    { hash: 'SHA-256', transforms: [ 'enveloped' ], uri: '', id: `ReferenceID-${ id }` },
                    { hash: 'SHA-256', uri: `#${ xadesXml.XmlSignature.KeyInfo.Id }` }
                ],
                policy: {
                    hash,
                    digestValue: 'dMoMvtcG5aIzgYo0tIsSQeVJBDnUnfSOfBpxXrmor0Y=',
                    identifier: {
                        value: 'https://facturaelectronica.dian.gov.co/politicadefirma/v2/politicadefirmav2.pdf',
                        qualifier: 'OIDAsURI'
                    }
                },
                signerRole: {
                    claimed: [ 'supplier' ]
                },
                signingCertificate: signingCertificates[ 0 ],
                signingTime: { format: signingTime }
            }
        )
```

Adicionalmente, nodejs no es una plataforma muy amigable para todo lo que tiene que ver con crypto, firmas, acceso a archivos porque estas son operaciones costosas que aun trabajandose asincronamente son tareas "bloqueantes" (segun la documentacion de node) osea que demoran mucho y ponen en espera a otras tareas (peticiones del usuario) por lo que siempre deben hacerse de forma asincrona y preferiblemente en microservicios externos que no bloqueen el flujo principal de nuestra aplicacion.

Dicho esto, si vamos a crear un micro para firmar xadesjs, soap, validar xsd, generar pdf (xsl)... pues hagamoslo en lenguajes que ya tienen librerias maduras para ellos, por rejemplo creas un microservicio en java/c# que haga todo lo referente a xml y lo llamas desde node, cuando java/c# termine le informa a node y node consolida la factura en base de datos...
...