none
Firmar XML con XAdES-EPES

    Pregunta

  • Buenas tardes, he estado trabajando arduamente durante los últimos dos meses en un desarrollo de Facturación Electrónica (especificamente para el caso de Costa Rica), ya tengo avanzado el proyecto en un 95% aproximadamente pero estoy detenido desde hace varias semanas en la parte final que es la Firma XAdES EPES que se aplica al documento XML de la Factura Electrónica, la documentación que he encotrado es poca, desactualizada, muy confusa y a veces hasta contradictoria, por lo que el avance a este respecto ha sido muy lento.

    En este foro he revisado algunas colaboraciones de usuarios con respecto a otras preguntas del mismo tema, me han ayudado un poco sin embargo todas las respuestas estan orientadas a .NET haciendo uso de las funciones propias del lenguaje pero por requerimientos ajenos a mi voluntad estoy programando en un lenguaje muy antiguo (VFP 9.0 shame on me!!!) que no posee funciones propias para trabajar con firmas digitales, por lo que he tenido que programar todo desde cero haciendo llamadas de lineas de comando usando el archivo externo openssl.exe, sin embargo ya todas estas dificultades han sido superadas y estoy detenido especificamente en la obtención de los digest values correctos para las siguientes porciones del Signature:

    • <xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod><ds:DigestValue>¿¿¿¿¿de donde obtengo este digest?????</ds:DigestValue>........Segun lo que he estado investigando este proviene de realizar el digest con sha1 del archivo de certificado .p12 (ojo, mi certificado es un archivo portatil y no esta en el almacen de certificados de windows) pero no estoy seguro de esto. Uso el siguiente comando para obtenerlo: openssl.exe dgst -binary -sha1 certificado.p12 | openssl enc -base64 -out certdigest.txt. En un momento anterior entendi que debo hacer el digest de la porción <ds:KeyInfo><ds:X509Data><ds:X509Certificate> del signature, pero nada me ha dado resultados y estoy perdido en este punto.
    • <xades:SigPolicyHash><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></ds:DigestMethod><ds:DigestValue>¿¿¿¿¿¿¿De donde obtengo este digest???????</ds:DigestValue>......Al igual que el digest anterior, con este estoy meramente asumiendo que debo hacer el digest del archivo descargado del link mencionado en <xades:SigPolicyId><xades:Identifier> https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf</xades:Identifier></xades:SigPolicyId>, pero tampoco estoy seguro, ademas resulta que este link esta roto, y el mencionado archivo nisiquiera lo puedo descargar. He descargado otro similar desde otro link pero tampoco me funciona, como pueden ver tambien estoy perdido.

    Los demas DigestValues los tengo relativamente claros y algunos ya validados como correctos (SignedInfo, SignatureValue, X509Certificate, sin embargo algunos digests dependen de estos 2 problematicos por lo que no he podido avanzar mas alla.

    Otro punto critico son las reglas de canonicalizacion, las cuales son un dolor de cabeza pero creo haber lidiado manualmente con ellas de manera mas o menos correcta, pero ya eso es otro tema.

    Como podrán ver mi problema es mas procedimental de la firma que del lenguaje de programación, por lo que me vendria bien la ayuda de cualquiera de ustedes colaboradores entendidos en esta materia de Firmas Digitales que tuviera a bien explicarme por esta via de donde obtener los digest mencionados. Realmente no necesito ejemplos de programación (ya he visto bastantes en .net) sino mas bien una explicación procedimental del metodo.

    Ya tengo claro cuales son los comandos del openssl para obtener los digest, tengo claro la encriptacion a usar, lo que me falta realmente es de donde obtenerlos?

    Gracias.


    • Editado Gregorik Domador viernes, 29 de diciembre de 2017 17:36 Correcion link pdf
    viernes, 29 de diciembre de 2017 17:31

Todas las respuestas

  • Y seguirás con dolor de cabeza si continuas por esa senda amigo, lo mejor es hacerlo en c#, generar la libreria para que la puedas consumir desde foxpro o en su defecto en java usando la librería xades4j.

    Yo intente hacer los mismo que tu en foxpro firma xmldsig, pero desistí y opte por realizarla en .net y generar la libreria. 

    Pero no hay nada imposible. por privado tal ves te pueda ayudar, he trabajado en la firma xades epes para DIAN colombia.

    Saludos

    viernes, 29 de diciembre de 2017 18:46
  • Gracias por tu respuesta amigo, pero como ya comente mi problema no es el lenguaje, ya tengo todo echo en Foxpro, ya genero el XML y la firma completa pero no logro validarla ante Hacienda CostaRica (me responde Firma Inválida) porque sospecho que estos 2 digest son incorrectos, necesito solamente la parte "procedimental", una explicación directa y concreta de donde sacar estos digest.

    Yo tambien tuve experiencia con Colombia y Ecuador, realice ambas Facturaciones Electronicas pero usando DFacture como intermediario (super fácil) y asi ni siquiera tuve que lidiar con este problema de la Firma Electronica, pero para Costa Rica lo estoy haciendo directo contra Haciena y es primera vez que me enfrento con estas Firmas Electrónicas.

    viernes, 29 de diciembre de 2017 19:01
  • Te comento porque yo también tengo mi ERP en Peru en foxpro, el generado del xml y envio a la administración tributaria, pero el proceso de firma tuve que realizar la dll en .net. (XMLDSIG en peru o firma basica) En el caso de peru y colombia  he trabajado directamente con el ws  de sus administraciones tributarias. En todo caso si insistes por ese camino te aconsejo que sigas los foros mexicanos alli me parecen que han lograron hacerlo integramente en foxpro (con ayuda  de openssl) claro que no es xades-epes.

    Saludos y suerte

     
    viernes, 29 de diciembre de 2017 19:13
  • Tal vez esto te pueda ayudar.

    https://github.com/josemmo/Facturae-PHP

    Saludos


    viernes, 29 de diciembre de 2017 19:25
  • Hola Gregorik, tambien he estado intentando hacer que me Hacienda (CR) me acepte esta firma y no hay manera.. me sigue respondiendo:

    La firma del comprobante electrónico no es válida

    He intentado de todo. Pudiste resolverlo de alguna manera? Cualquier informacion en este momento es de gran ayuda. Gracias

    domingo, 04 de marzo de 2018 15:58
  • Hola, me gustaría saber cómo agregaste el certificado dentro del documento xml y que la DIAN lo pudiera validar.

    Gracias

    martes, 06 de marzo de 2018 17:17
  • Buen dia, Jose me gustaria que me ayudara con el tema de la firma para la DIAN colombia... estoy trabajando en C#... cualquier ayuda es bienvenida.
    martes, 06 de marzo de 2018 17:40
  • Saludos, 

    Lograstes hacer la firma desde .net?, me puedes ayudar?

    viernes, 09 de marzo de 2018 5:17
  • Saludos,

    Lograstes firmar la factura con .net?, me puedes ayudar con este tema?

    viernes, 09 de marzo de 2018 5:17
  • Jose buenas tardes, estoy como atascado con el tema de la firma digital, el servicio de la dian siempre me retorna que no es válida, no se si el tema es de como se están asignando los prefijos o de como se guarda el xml firmado. Me puede ayudar con algun tip para solucionar esto, muchas gracias
    jueves, 17 de mayo de 2018 18:11