Factura electronica – ¿Cómo se obtiene el sello digital en un CFDI?

Hablando de facturación electrónica y basandome en los manuales que encontre quiero comentarles el método para generar el Sello digital para incrustarselo en el XML que se enviara al SAT.

En el tan afamado Anexo 20 de la Resolución Miscelánea Fiscal para 2009  que en resumen dice que para obtener el sello digital solo necesitamos calcular el MD5 de la cadena Original y después con nuestra llave privada (terminación .key.pem) le pasamos una encriptacion con RSA y el resultado de esto lo encriptamos en Base64 y listo tenemos nuestro sello digital y el comando es:

openssl dgst sign [URL_DE_LLAVE_PRIVADA] [URL_ARCHIVO_CADENA_MD5_DE_CADENA_ORIGINAL] | openssl enc -base64 -A  [URL_ARCHIVO_SALIDA_PARA_SELLO_DIGITAL]

Solamente necesitas reemplazar las variables que estan entre [] por tus datos y listo fácil y rápido obtendrás tu sello digital

No olvides visitar algunos tips para implementar factura electronica

He encontrado otro metodo para generar el sello digital, cadena original y el MD5 de esta…

xsltproc archivo_base_convertir_xsd.xsl archivo_xml.xml  openssl dgst -md5 sign llave_privada.key.pem | openssl enc base64 -A

A partir del 2011 es necesario ocupar encriptación SHA1

xsltproc archivo_base_convertir_xsd.xsl archivo_xml.xml  openssl dgst -md5 sign llave_privada.key.pem | openssl enc base64 -A

Cualquier duda en los comentarios, consultando todos mis temas que tengo de factura electrónica.

Si quieres conocer más de la Facturación electrónica, has clic aqui.  o deseas más información de los cambios que hubo en la facturación electrónica este 2011, visita este enlace

Pero si lo que necesitas es consultoría personalizada Solo contactame


Escrito por

Ing. En computación y WebDeveloper de profesión. Empresario y blogger de vocación, Libre y diferente por convicción. + de mi en xataka.com.mx y solucionesim.net/blog

48 pensamientos en “Factura electronica – ¿Cómo se obtiene el sello digital en un CFDI?

  1. Sin duda las empresas de software ya implementaron lo de la facturacion electronica de manera correcta, y esto es generado por las empresas certificadoras.

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  2. Si quiere Ud. obtener factura electronica de importantes cadenas mexicanas en un solo click, favor intentelo en esa pagina: facturamexico.blogspot.com

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  3. Hola a todos
    Gracias por compartir…
    Tengo que encontrar la forma de generar certificado y sello para las cove o sea los documentos electronicos de el sistema de ventanilla unica para las transaciones de importacion y exportacion en Mexico

    Ellos recomiendan usar OpenSSL, que es etupendo,pero yo debo generar el certificado y el sello en forma dinamica desde una aplicacion en delphi

    No he conseguido encontrar ningun material que me guie para usar la biblioteca de criptografia de openssl en delphi,por lo cual estoy desarmado

    Exigen que sea con algoritmo de digestion sha1 y estandar de firma pks7

    Puede alguien guiarme en esto para poder generar dinamicamente con Delphi ?

    Mil millones de gracias

    Leonardo

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  4. Hola a todos

    Quiero comentarles de una librería que estoy usando para la generación y validación de un CFD o CFDI, esta librería puede ser usada en C#, Delphi o cualquier otro lenguaje de programación, les dejo la liga de donde puedes descargarla junto con sus ejemplos

    http://www.electronicdocument.com.mx

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  5. Hola Tomgzlz

    Si deseas generar el CFD o CFDI, te invito a que uses una librería que he desarrollado y que te permite generar fácilmente este tipo de archivos, esta librería cumple con todos los requisitos exigidos por el SAT, además de que te ayuda a generar el CBB, el reporte mensual, te permite validar una factura electrónica, te hace la integración con el PAC, etc.

    Esta librería la he liberado no tiene costo alguno.

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  6. Hola a todos,

    Quiero agradecer por la información de cómo generar se genera el sello digital, aunque llevo tiempo generar facturas electrónicas, nunca sabia como generarlo porque he estado usando un librería que quiero recomendar ya que me permitió fácilmente integrar la factura electrónica en la empresa donde trabajo, es muy sencilla de usar, generar CFD y CFDI, además de que tiene la integración con el PAC, también genera el código de barras bidimensional; quiero invitarlos a que la prueben ya que a mí me fue de mucha utilidad y creo que proyectos como esto es bueno darlo a conocer, ya que además de todo es totalmente gratuita.

    Saludos a todos

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

    • Podrias indicarme el nombre o pagina en donde la puedo encontrar, gracias!!!

      ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  7. hola alguien me podria ayudar a implementarlo a C# o algun tutorial que tengan

    me gustaria saber,

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  8. Pingback: Factura electronica – genera Cadena Original y Sello Digital con Visual Basic - Negocios Web | CarlosNuel

  9. Tiene idea del comando o instrucciones para generar el sello digital desde PL/SQL ?? ya genere la factura electronica desde programacion en VFP, pero necesito pasar todo esto a PL/SQL. Ya tengo la base de datos en ORACLE solo me falta el Sello.

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  10. Hola a todos…. como puedo generar el sello digital en PL/SQL de Oracle

    gracias de antemano

    Saludos

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  11. Gracias a todos los que ponen sus dudas y soluciones he logrado crear mi comprobante fiscal digital, de aquí y de otras páginas, les dejo mi código por si a alguien le sirve, es visual basic 2008:

    Cadena Original:

    Cadena = “|”
    SGL_Query = “SELECT EFA_CEFA,EFA_NUME,CONVERT(VARCHAR,EFA_FECH,126),CTE_NORS,CTE_RFCC,CTE_CALL,CTE_NEXT,CTE_NINT,CTE_COLO,”
    SGL_Query = SGL_Query & “PDM_DESC, ENT_DESC, PAI_DESC, CTE_CODP ”
    SGL_Query = SGL_Query & “FROM TDFCTEFA, TCFCTCTE, TCRHUPAI, TCRHUPDM, TCRHUENT ”
    SGL_Query = SGL_Query & “WHERE EFA_CCTE = CTE_CCTE And CTE_CPDM = PDM_CPDM And CTE_CENT = ENT_CENT ”
    SGL_Query = SGL_Query & “And CTE_CPAI = PAI_CPAI ”
    SGL_Query = SGL_Query & ” AND EFA_CEFA=” & Val(Txt_Clave.Text)
    Call Ejecuta(sat, SGL_Query)
    Do Until TraeSig(sat) = NOMOREROWS
    Cadena = Cadena + “|2.0|A”
    Cadena = Cadena + “|” + Trim(DameDato(sat, 2))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 3))
    Cadena = Cadena + “|174911|2010|ingreso|efectivo|Pago en una sola exhibicion|subtotal|0|grantotal”
    Cadena = Cadena + “|JSI060303UA9|JF SISTEMAS, S. A. DE C. V.|MIRAVEREDA|23|B|CUMBRIA”
    Cadena = Cadena + “|CUAUTITLAN IZCALLI|ESTADO DE MEXICO|MEXICO|54740″
    Cadena = Cadena + “|” + Trim(DameDato(sat, 5))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 4))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 6))
    If Trim(DameDato(sat, 7)) + Trim(DameDato(sat, 8)) “” Then
    Cadena = Cadena + “|” + Trim(DameDato(sat, 7)) + Trim(DameDato(sat, 8))
    Else
    Cadena = Cadena + “|”
    End If
    Cadena = Cadena + “|” + Trim(DameDato(sat, 9))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 10))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 11))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 12))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 13))
    Loop
    SGL_Query = “SELECT DFE_CANT,DFE_CONC,DFE_IMPO,DFE_CANT*DFE_IMPO,DFE_IIVA*DFE_CANT,DFE_CONS ”
    SGL_Query = SGL_Query & “FROM TDFCTDFE WHERE DFE_CEFA=” & Val(Txt_Clave.Text)
    Call Ejecuta(sat, SGL_Query)
    Dim ImpIva As Double
    ImpIva = 0
    GTotal = 0
    Subtotal = 0
    Do Until TraeSig(sat) = NOMOREROWS
    Cadena = Cadena + “|” + Trim(DameDato(sat, 1))
    Cadena = Cadena + “|PZA”
    Cadena = Cadena + “|” + Trim(DameDato(sat, 6))
    Cadena = Cadena + “|” + Trim(DameDato(sat, 2))
    Cadena = Cadena + “|” + Trim(Str(CorrigeMoneda(DameDato(sat, 3))))
    Cadena = Cadena + “|” + Trim(Str(CorrigeMoneda(DameDato(sat, 4))))
    ImpIva = ImpIva + Val(CorrigeMoneda(DameDato(sat, 5)))
    Subtotal = Subtotal + CorrigeMoneda(DameDato(sat, 4))
    GTotal = GTotal + CorrigeMoneda(DameDato(sat, 4)) + CorrigeMoneda(DameDato(sat, 5))
    Loop
    Cadena = Cadena + “|IVA|” + Trim(Str(IIva * 100))
    Cadena = Cadena + “|” & Trim(Str(ImpIva))
    Cadena = Cadena + “|” & Trim(Str(ImpIva))
    Cadena = Cadena + “||”
    Cadena = Replace(Cadena, “subtotal”, Trim(Str(Subtotal)))
    Cadena = Replace(Cadena, “grantotal”, Trim(Str(GTotal)))
    System.IO.File.WriteAllText(“C:\SARV3.1J\ELE\cadena_orig.txt”, Cadena)

    archivo XML:

    Dim ANIO As Long
    ANIO = 0
    SGL_Query = “SELECT YEAR(EFA_FECH) FROM TDFCTEFA WHERE EFA_CEFA=” & Val(Txt_Clave.Text)
    Call Ejecuta(sat, SGL_Query)
    Do Until TraeSig(sat) = NOMOREROWS
    ANIO = Val(DameDato(sat, 1))
    Loop
    Dim W As New XmlTextWriter(“C:\SARV3.1J\ELE\” & Txt_Clave.Text & “.xml”, System.Text.Encoding.UTF8)
    W.WriteStartDocument()
    Shell(“C:\OpenSSL-Win32\bin\openssl.exe pkcs8 -inform DER -in C:\SARv3.1J\ELE\JSI060303UA9_0903250930.key -passin pass:chela2009 -out C:\SARV3.1J\ELE\JSI.key.pem”)
    System.Threading.Thread.Sleep(500)
    Shell(“C:\OpenSSL-Win32\bin\openssl.exe x509 -inform DER -outform PEM -in C:\SARv3.1J\ELE\jsi060303ua9_1010061243s.cer -pubkey -passin pass:chela2009 -out C:\SARV3.1J\ELE\JSI.cer.pem”)
    System.Threading.Thread.Sleep(500)
    If ANIO 0 Then
    W.WriteStartElement(“Impuestos”)
    W.WriteAttributeString(“totalImpuestosTrasladados”, Trim(Str(ImpIva)))
    W.WriteStartElement(“Traslados”)
    W.WriteStartElement(“Traslado”)
    W.WriteAttributeString(“impuesto”, “IVA”)
    W.WriteAttributeString(“tasa”, Trim(Str((IIva * 100))))
    W.WriteAttributeString(“importe”, Trim(Str(ImpIva)))
    W.WriteEndElement() ‘finaliza traslado
    W.WriteFullEndElement() ‘finaliza traslados
    W.WriteFullEndElement() ‘finaliza impuestos
    End If
    W.WriteStartElement(“Impresion”)
    W.WriteAttributeString(“CadenaOriginal”, Cadena)
    W.WriteFullEndElement()
    ‘…………………………………
    W.WriteFullEndElement() ‘finaliza comprobante
    W.WriteEndDocument() ‘finaliza documento
    W.Flush()
    W.Close()

    obviamente yo uso mi base de datos, espero entiendan el código y lo adapten al suyo.

    ¿Te gusta este comentario? Thumb up 0 Thumb down 0

  12. Hola amigos, despues de varias semanas de desarrollo, pruebas, visitas a foros, etc en la empresa que tenemos decidimos liberar el codigo que estaremos usando para la facturación electrónica como código abierto para que la comunidad se beneficie. Pueden ver más información sobre este proyecto asi como descargarlo junto con ejemplos, etc de la siguiente liga:

    http://www.bambucode.com/codigoabierto/facturacion_electronica_delphi.php

    Algunas caracteristicas de la libreria:

    - Hecha 100% en clases para que sea facil de usar en cualquier proyecto.
    - Usa OpenSSL y no requiere librerias o DLLs adicionales.
    - Realiza el sellado de la factura llamando directamente al DLL de OpenSSL y usando la llave privada en formato .key por lo que no es necesario convertirla a formato PEM evitando los problemas de tener el archivo PEM sin llave de por medio en el disco duro del usuario.
    - Obtiene el certificado en base64 para incluirlo en la factura XML directo de la libreria OpenSSL por lo que no se usa para nada llamados a openssl.exe
    - Todas las funciones y procedimientos son probados con pruebas de unidad (a traves de DUnit).
    - 100% codigo abierto y gratuita.

    Publicamos el código de esta librería ya que al menos hace unos meses no encontramos nada parecido y lo vimos como una necesidad que beneficiaría a toda la comunidad en este tema de facturación electrónica que puede llegar a ser bastante complejo.

    Gracias a sitios como este y a toda la comunidad por compartir el conocimiento, esperamos esta sea una manera de regresar algo a cambio.

    Saludos!

    ¿Te gusta este comentario? Thumb up 1 Thumb down 0