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 1

  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

  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

  13. Hola a todos buen dia.

    El foro si me esta sacando de muchas dudas, como describes el comando para generar el sello lo complementaria de esta manera.

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

    Muchas gracias por tus aportaciones.
    Saludos

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

  14. Hola que tal necesitaria su ayuda para realizar el sello digital por medio de C# en Visual Studio 2008. Les agredezco de antemano.

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

  15. que talk Juan manuel, ps ya ejecute tu codigo pero en

    ($proc->importStyleSheet($xsl);)

    Se atota y dice “apache.exe – Error de aplicacion en la instruccion 0x019d1ef1 hace referencia a la memoria en “0x0000000c”, la memoria no se read”

    haga click en aceptar para finalizar
    haga click en cancelar para depurar.

    Pero cualquiera de las dos no soluciona nada.. vuelve a salir..
    que puede ser.

    Saludos a todos.

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

  16. Hola, otra vez yo, disculpa por no haber podido responderte con certeza. sinceramente estube metido leyendo algunas cosas, parece que todo va mejor, ya genero el archivo XML, solo hay un detalle, no tengo idea de como generar el sello digital. uso vb.net, no si debo descargar algun convertidor de base 64 o algo asi.

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

  17. Hola soy nuevo en esto de la facturación electrónica.
    La verdad que no tengo idea, he leído algo acerca de como generarla, pero primero que nada quisiera saber si me pueden ayudar a entender que es lo primero que debo hacer.

    Tengo algunas clases en visual basic .net que contienen los datos de la factura
    Pero la parte del sello digital y la cadena original, como la obtengo?

    ¿estos son independientes a los folios de la Factura que da el SAT?? por donde debería empezar?

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

    • Que tal? El sello digital lo obtienes con la cadena original y la llave privada, yo implemente la factura electronica en C# … si necesitas te asesoro para hacer los respectivo a la factura electrónica

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

      • Hola a mi tambien me interesa saber mas sobre la generacion del sello, no puedo hacer la encriptacion RSA con la llave privada.. Ojala y puedas ayudarme…

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

      • Que tal Juan Manuel tengo un detalle con el sello digital en C#, hasta la digestion voy bien, pero despues a la hora de agregar la llave privada a la encriptación RSA ya no me da el resultado esperado, a donde te puedo enviar mi par de metodos que hacen esto para ver si le puedes echar un ojo, gracias.

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

      • Hola, como uso el OpenSsl en C#, me refiero a que tengo que instalar, tengo un exe llamado asi y desde linea de comandos puedo crear las instrucciones, me gustaria saber si es esto lo que necesito y llamarlo con shell desde C# o hay algo mas integrado, por favor que no sea de uso comercial. si me podrias mostrar algun ejemplo de codigo. saludos

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

  18. Si tienes el archivo de llave privada ya convertido a pem entonces puedes hacer lo siguiente desde PHP

    $dom1 = new DOMDocument();
    $dom1->load(‘factura.xml’); //Cargas el XML de la factura (los datos aun estan incompletos)

    $xsl = new DOMDocument;
    $xsl->load(‘cadenaoriginal_2_0.xslt’);//Cargas el xsl

    $proc = new XSLTProcessor;
    $proc->importStyleSheet($xsl);
    $cadena_original=$proc->transformToXML($dom1);//Transformas la salida, y obtiens la cadena original

    $file=’llaveprivada.pem';//llave privada
    $pkeyid = openssl_get_privatekey(file_get_contents($file));//Obtienes la llave privada
    openssl_sign($cadena_original, $crypttext, $pkeyid, OPENSSL_ALGO_MD5);//Firmas la cadena original
    openssl_free_key($pkeyid);
    $sello = base64_encode($crypttext); // lo codifica en formato base64
    $comp=$dom1->getElementsByTagName(‘Comprobante’)->item(0)->attributes->getNamedItem(‘sello’)->nodeValue=$sello; //agregas el sello
    $dom1->save(‘factura.xml’);//guardas de nuevo el sml ya completo

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

    • Hola Juan Manuel, estoy con esto de la factura electronica con php, probe tu codigo y logre sacar el sello segun lo esperado, pero en la parte

      $xsl = new DOMDocument();
      $xsl->load(“d:\cadenaoriginal_2_0.xslt”);//Cargas el xsl

      $proc = new XSLTProcessor();
      $proc->importStyleSheet($xsl);
      $cadena_original=$proc->transformToXML($dom1);//Transformas la salida, y obtiens la cadena original

      marca error

      Warning: DOMDocument::load() [domdocument.load]: Start tag expected, ‘<' not found in file:///d:/cadenaoriginal_2_0.xslt, line: 2 in D:\xampp\htdocs\md5.php on line 120

      Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: compilation error in D:\xampp\htdocs\md5.php on line 123

      Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: xsltParseStylesheetProcess : empty stylesheet in D:\xampp\htdocs\md5.php on line 123

      Warning: XSLTProcessor::transformToXml() [xsltprocessor.transformtoxml]: No stylesheet associated to this object in D:\xampp\htdocs\md5.php on line 124

      No se que este pasando, espero puedas ayudarme, gracias!

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

    • Querido Juan manuel
      No sabes la felicidad que tuve al encontrar tu codigo y al probarlo ver en Validador de forma y sintaxis de Comprobantes Fiscales Digitales de SAT el siguiente texto:

      El sello del comprobante es válido

      Gracias brother!!!

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

    • que tal, oye algún correo dond localizarte, ya que he visto tu trabajo y me gustaría ver si me puedes asesorar, espero me puedas apoyar, gracia

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

  19. Pingback: Como convertir XML a XSD y despues a HTML para la Factura Electronica | Web, Negocios y mas

  20. Hola mi nombre es Victor de Jesus me gustaria saber sobre como generar mis archivos xml (Factura electronica) y veo que tu ya estas mas empapado sobre esto

    De dond eres ??? y me gustaria si puedes asesorarme con respecto a este tema y mas sobre el aspecto tecnico : Como genero la cadena que se incluye en la factura , ya cuento con un sistema implementado en VB6 que genera facturas que se imprimen en papel , mas no el CFD

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

    • Si gustas puedo enviarte informacion de facturación y su implementacion, y si estas interesado puedo resolver tus problemas.

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

  21. Hola buen dia, no se si me pudieras decir como llegaste al archivo .key.pem correcto, segun yo llegue a el, pero al validar la factura en la pagina del sat me marca un error, y no se si me falte ahcer algun paso alterno…

    Descargue unos archivos para pruebas que da el sat: aaa010101aaa_CSD_01.cer y .key asi como su contraseña.

    Linea de comando:
    openssl -inform DER -in aaa010101aaa_CSD_01.key -out aaa010101aaa_CSD_01.key.pem

    Y nada mas, con ese .pem estoy generando luego el comando que tienes descrito para digerirlo en md5 la cadena original con el .key.pem en un mismo paso, pero me da error… Me hara falta algo para generar el .pem correcto?

    Gracias de antemano y Saludos.

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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>