You are on page 1of 6

Tutorial para la generacin del sello de un CFD

He decido realizar este corto tutorial debido a que he visto que muchos desarrolladores tienen problemas a la hora de generar el sello que nos pide el SAT. No me considero alguien que domina todo el tema de los CFD al 100% pero por lo menos si he dado con la forma correcta de generar el sello que pide el SAT y que pase la validacin. Espero tener tiempo para que en un momento posterior pueda hacer un tutorial mas completo que incluya pasos para la generacin del XML as como la validacin de los CFDs que recibamos. Requisitos

Conocimientos bsicos de Visual Basic 6. Saber que es XML y como generar el archivo XML con el encoding correcto (UTF-8). Visual Basic 6 o VBA. Aunque en los ejemplos uso Visual Basic 6 en teora cualquier lenguaje que acepte el uso de componentes ActiveX (Delphi, FoxPro) puede realizar el mismo proceso. El componente RSA de Chilkat, pueden usar la versin de prueba por 30 dias. Este lo pueden descargar haciendo clic aqu. De los componentes comerciales este es el que se me ha hecho mas fcil de usar y ademas est a un precio razonable. El componente XML 6 de Microsoft, si es que an no lo tienen. Hagan clic aqu para descargarlo. De forma alternativa pueden usar algn otro procesador de XML que incluya XSL. Uno que he encontrado y que por cierto es muy completo y gratuito es el de Altova. Pueden checarlo aqu. OJO: el ejemplo solo muestra el uso con el de Microsoft. Haber ledo el anexo 20 para que mas o menos tengan una idea de la secuencia y los requisitos que pide el SAT. El anexo lo incluyo con los archivos de ejemplo. Este es el que se publico el 15 de junio de 2010. Los archivos de este tutorial.

Obteniendo la cadena original El primero paso para generar el sello es obtener la cadena original. He visto que varios desarrolladores lo hacen de manera manual, es decir, extraen cada parte de la factura y forman la cadena original. Sin embargo el SAT proporciona los archivos necesarios para generar esto de una manera mas simple y con la estructura vlida. En la pgina del SAT y en los archivos que acompaan este tutorial los encontrarn. Con estos 2 archivos (cadenaoriginal_2_0.xslt y utilerias.xslt) podemos extraer la cadena original tanto de los CFDs que generemos asi como de los que recibamos. Lo unico que tenemos que hacer es usar un procesador de XSL. En este tutorial usaremos el MSXML de Microsoft para obtener la cadena original. Lo que hay que entender de esto es que vamos a aplicar la hoja de estilo XSL al archivo XML del CFD que generemos. Si todo va bien entonces el resultado de esto ser la buscada cadena original que no es mas que datos clave del CFD separados por el carcter comunmente denominado pipe |. El archivo cadenaoriginal_2_0.xslt procesa el archivo XML que le estamos pasando para extraer los elementos necesarios y en base a esto generar la cadena original vlida. Hay que tener en cuenta que debemos de tener conexin a internet a la hora de realizar esto, ya que hay otros archivos que sern requeridos. Este proceso tambin puede ser llevado a cabo off-line (lo cual se ejecuta mas rpido) pero tenemos que descargar todos los archivos que solicita el archivo cadenaoriginal_2_0.xslt y modificar este ltimo para que no los intente tomar de la pgina del SAT. A continuacin muestro el cdigo que se encarga de generar la cadena original.

Private Function GetCadenaOriginal(ByVal ArchivoXML As String) As String Dim xslt As New MSXML2.XSLTemplate60 Dim xslDoc As New MSXML2.FreeThreadedDOMDocument60 Dim xmlDoc As New MSXML2.DOMDocument60 Dim xslProc As IXSLProcessor xslDoc.async = False xslDoc.Load App.Path & "\cadenaoriginal_2_0.xslt" ' Este archivo es proporcionado por el SAT If (xslDoc.parseError.errorCode <> 0) Then Dim myErr Set myErr = xslDoc.parseError MsgBox "Error en la hoja de estilo: " & myErr.reason Else xslDoc.setProperty "ResolveExternals", True ' Esta lnea es importante ya que sin ella el proceso no se ejecutar de manera correcta. Set xslt.stylesheet = xslDoc xmlDoc.async = False xmlDoc.Load ArchivoXML If (xmlDoc.parseError.errorCode <> 0) Then Set myErr = xmlDoc.parseError MsgBox "Error en el documento XML: " & myErr.reason Else Set xslProc = xslt.createProcessor() xslProc.input = xmlDoc xslProc.Transform GetCadenaOriginal = xslProc.output End If End If End Function

Obtencin del sello Por fin llegamos a la parte que nos interesa y que genera tantos dolores de cabeza para varios de nosotros. Lo que el SAT nos pide es que una vez que tengamos la cadena original codificada en UTF-8 le hagamos una digestin usando el algoritmo MD5 (algunos le llaman a este proceso hashear). Despus de ello debemos encriptar el resultado usando nuestra llave privada (private key) usando el algoritmo de encriptacin RSA. Una vez teniendo este dato procederemos a convertirlo en base 64 para que pueda ser imprimible ya que el resultado de la encriptacin no siempre constar de caracteres que se puedan visualizar. Lo que me gusto del componente de Chilkat es que puede realizar estos 3 pasos de una manera sencilla. A continuacin muestro el cdigo que realiza esto.

Public Function GenerarSello(ByVal ArchivoXML As String) As String Dim pkey As New privateKey pkey.LoadPkcs8EncryptedFile App.Path & "\aaa010101aaa_CSD_01.key", "a0123456789" Dim success As Long Dim pkeyXml As String pkeyXml = pkey.GetXml() Dim rsa As New ChilkatRsa success = rsa.UnlockComponent(CKKEY) If (success <> 1) Then Debug.Print rsa.LastErrorText & vbCrLf Exit Function End If success = rsa.ImportPrivateKey(pkeyXml) If (success <> 1) Then Debug.Print rsa.LastErrorText & vbCrLf Exit Function End If rsa.Charset = "utf-8" rsa.EncodingMode = "base64" rsa.LittleEndian = 0 Dim base64Sig As String base64Sig = rsa.SignStringENC(GetCadenaOriginal(ArchivoXML), "md5") GenerarSello = base64Sig End Function

La ya clsica pantalla del validador del SAT Archivos de ejemplo El proyecto de ejemplo fu desarrollado en Visual Basic 6 SP6. Para probar el ejemplo abran el archivo Muestra_v2_base.xml haciendo clic en el botn Abrir CFD, luego hagan clic en el botn Sellar. Una vez que haya sido sellada vuelven a hacer clic en el botn Abrir CFD pero esta vez abren el archivo Muestra_v2_sellada.xml que acaba de ser generado y dan clic en el botn Validar sello para que comprueben que el sello generado es vlido. Yo ya lo prob contra el validador del SAT y pasa la prueba. La lista completa de los archivos de este ejemplo son: 1. anexo_20_15Jun2010.pdf 2. aaa010101aaa_CSD_01.cer 3. aaa010101aaa_CSD_01.key 4. cadenaoriginal_2_0.xslt 5. utilerias.xslt 6. Muestra_v2_base.xml 7. A2.xml 8. frmPrincipal.frm 9. modGeneral.bas 10.SelloCFDs.vbp

Validacin del sello La validacin del sello se lleva a cabo usando el certificado incluido en la factura o en su defecto tendrian que pedirselo a quien les entreg la factura. El sello tiene que ser decodificado de base 64. Con esto queda el hash MD5 y este se compara contra el proceso que resulta de generar la cadena original y crear su hash con la llave publica contenida en el certificado. Si ambos resultados coinciden el sello es vlido. Validacin de la factura El validador del SAT solo revisa 3 caracteristicas: que el encoding sea UTF-8, la validez criptogrfica del sello y que el certificado tenga validez en sus fechas. Otros validadores aparte de ello contemplan lo siguiente:

Que el certificado usado est en la lista emitida por el SAT y siga siendo vlido. Que la serie y el folio del CFD se encuentre autorizado por el SAT La validacin de los Namespaces del documento La validacin contra el esquema del SAT La validacin contra los esquemas de quien la origina, si fuera el caso

Conclusin Pues bien, espero que este tutorial (si es que se le puede llamar as), le sea de utilidad, sin embargo tenga en cuenta que solo es un material de apoyo y por lo tanto no puedo asumir responsabilidad por el uso que le de a esta informacin. Siempre consulte la pgina del SAT antes de llevar a cabo la implementacin en su sistema informtico. Como mencione antes ojal me sea posible escribir un tutorial mas completo acerca de este asunto relacionado con los CFDs ya que no hay mucha informacin para nosotros los programadores. Si notan algn error o tienen alguna sugerencia o duda me gustara escucharla aunque no prometo contestar rpido ya que estar muy ocupado los siguientes meses debido al desarrollo del sistema de facturacin electrnica de la empresa donde trabajo. Sin embargo de vez en cuando me dar el tiempo para revisar sus comentarios y correos. Si desean que les ayude de manera profesional tambin estoy mas que disponible. Agradecimientos y crditos Si desean agradecer el esfuerzo que puse en crear este corto tutorial se me ocurren al menos 2 formas en las que lo pueden hacer. Ofreciendome trabajo de consultora o mandndome una foto de algn lugar interesante de la ciudad donde viven. Para finalizar enlistar los nombres y direcciones de personas, empresas u organizaciones de donde tom informacin para entender un poco mas del proceso de la factura electrnica. La pgina del SAT sobre comprobantes fiscales digitales. http://www.sat.gob.mx/sitio_internet/e_sat/comprobantes_fiscales/default.asp Servidor FTP del SAT que contiene informacin interesante acerca de los CFD ftp://ftp2.sat.gob.mx/asistencia_ftp/publicaciones/solcedi/

La RMF 2010 http://www.sat.gob.mx/sitio_internet/informacion_fiscal/legislacion/52_18801.html La pgina de Microsoft sobre XML http://msdn.microsoft.com/es-mx/data/ff683554(en-us).aspx La pgina de ejemplos de Chilkat http://www.example-code.com/vb/rsa.asp http://www.example-code.com/vb/rsa_openssl_sign.asp Por cierto en la pgina de ejemplos de Chilkat podrn encontrar el uso de estos componentes con otros lenguajes de programacin entre los cuales estn Java, C#, Delphi y FoxPro. La pgina de CryptoSys PKI Toolkit (otro componente para crear el sello) http://www.cryptosys.net/pki/satmexico.html

La muy til y consultada pgina de Fernando Ortiz http://www.lacorona.com.mx/fortiz/sat/ AMECE (Asociacin Mexicana de Estndares para el Comercio Electrnico) http://www.amece.org.mx/amece/ http://www.tufactura.me/ Si desean ponerse en contacto conmigo ya sea para algn trabajo o porque encontraron este documento y no tienen los archivos de ejemplo escribanme a factura.me@live.com.mx Carlos Sosa, tcnico en sistemas computacionales.

You might also like