
Probando lazarus con los comprobantes fiscales digitales del sat
#1
Escrito 31 marzo 2010 - 08:05
Bueno para empezar ya descargue e instale lazarus.
Ahora según leo en las páginas del sat tengo que seguir estos pasos
1. Usar este archivo xsd como lo dice aquí para crear un xml el cual después tengo que convertir a una cadena original con este xslt
2. Esa cadena original se convierte a un sello digital usando unos archivos .cer, .key y una contraseña que están aquí
3. El sello digital se obtiene de aplicar el hash md5 en la cadena original, al hash obtenido se encripta con el algoritmo RSA usando el archivo .key y la contraseña del archivo Cer_Sello.zip, los bytes encriptados se deben convertir a letras con una codificación que se llama Base64 por lo que dice aquí.
4. Por último el archivo .cer se abre con el algoritmo x509, se obtiene su serie y se le agrega como un atributo "noCertificado" al xml, luego se codifica en Base64 los bytes y se agrega la cadena obtenida al xml como un atributo "Certificado", al final tambien se agrega otro atributo llamado "sello" que va tener la cadena en base64 obtenida en el paso anterior con lo que nos queda un xml firmado.
Bueno eso es lo que se hasta ahorita así que si alguien sabe algo más haber si lo puede compartir aquí. Mientras tanto yo voy a tratar de hacerlo y voy a ir subiendo lo que me vaya saliendo de los pasos anteriores.
#2
Escrito 31 marzo 2010 - 08:12
Salud OS
#3
Escrito 31 marzo 2010 - 09:07
Con respecto a los algoritmos de encriptación yo utilicé la biblioteca OpenSSL con una adaptación hecha para Delphi que puedes descargar desde aquí . Pero como OpenSSL está desarrollada con lenguaje C yo creo que lo podrás utilizar en Lazarus sin problemas.
Con esta bilbioteca tienes funciones para leer certificados x509, tienes los algoritmos RSA, MD5, Base64 y puedes leer las llaves privadas aunque no directamente en el formato que te envía el SAT debes convertirlas antes de abrirlas con OpenSSL.
Veo que vas avanzado con el proyecto ya que una buena parte consiste en documentarse y entender de qué se trata el asunto, ahora solo falta llevarlo al código.
Saludos
#4
Escrito 01 abril 2010 - 02:23
Saludos
#5
Escrito 02 abril 2010 - 02:14
Primero descargue el openssl para windows de aquí, luego tuve que convertir el archivo .key como comento hector con openssl usando este comando que encontre aquí
openssl pkcs8 -inform DER -in AAA010101AAA_0408021316S.key -out AAA010101AAA.key.pem
Despues agregue la bioblioteca de la liga que puso hector nomas que no me compilaba hasta que le cambie el modo a delphi en las opciones del compilador y de la misma página copie este ejemplo para usar el hash md5 y el algoritmo rsa además de otras funciones que estan en este otro ejemplo.
Para la parte de codificar en base64 encontre este ejemplo que usa la unidad base64 que ya trae lazarus.
Y para el ejemplo de cadena original use la que se encuentra en esta página del sat.
En el archivo adjunto viene el código de todo esto ya junto que convierte la cadena original siguiente:
||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente, S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||
En este sello digital:
p7hGSgj1aHWWkibqXWj3PL03HgwqONdjOaWjvH1ayRPx/ZPOuocxXBnLNteNpZBMsw+vjJhT7eElrkdO/+5VOu0Eai/zjwbZgSsOOEhjSzIkL0s35d9w/CcqDDj1zsmlOnQr5y9d+8cOZoPHP07r5jq10IhNQcPw4RhXo+CV71k=
Ahora voy a buscar haber como le hago para manejar los xml así que si alguien tiene alguna información al respecto haber si la puede compartir

Archivos adjuntos
#7
Escrito 02 abril 2010 - 01:40
Debo señalar que en el momento en que a mi me tocó hacer esta investigación encontré poca información en la red y además quienes ya habían logrado echar a andar los comprobantes fiscales se negaban a compartir sus avances e incluso encontré personas que cobran por darte asesoría. Es verdad que el conocimiento tiene su precio yo no digo que no deba ser así, en ocasiones la información pertenece a la empresa para la cual trabajas y no puedes publicarla, por eso siempre es bueno encontrar personas como tú que no teman a compartir con los demás sus experiencias e incluso subir el código fuente por si alguien lo necesita.
Saludos y gracias.
#8
Escrito 02 abril 2010 - 08:49
Ahora estoy probando unas bibliotecas para manipular xml que al igual que openssl estan hechas en c y tambien se pueden acceder desde delphi usando una adaptación que encontre aquí.
Luego les cuento como me fue.
Saludos
#9
Escrito 03 abril 2010 - 05:42
Nota: Para que me dejara subir el archivo borre la biblioteca libeay32.dll que ya viene en el primer ejemplo que subi.
Saludos
Archivos adjuntos
#10
Escrito 03 abril 2010 - 10:44
iCflad7c1gqlRSa1yy507ZtdtJ+WPGmx5duoqHaOkSymecQMJmLBjD6r3G/7isuJKR6QUQXjYteM9ppXcQ3K/
hxAhCFAXYjA9PIjWruqvftyLUobRSxraWdaQw3pH4IFq1MxgThd15P5xxTkmcEz34rM23/fdyTTip8PUJugUTy
Y no me queda el mismo resultado, utlizando el mismo archivo pem...
Para codificar en base64 utilizo el siguiente algoritmo que encontré:
function TFunciones.Encode64(S: string): string; const Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'; var i: Integer; a: Integer; x: Integer; b: Integer; begin Result := ''; a := 0; b := 0; for i := 1 to Length(s) do begin x := Ord(s[i]); b := b * 256 + x; a := a + 8; while a >= 6 do begin a := a - 6; x := b div (1 shl a); b := b mod (1 shl a); Result := Result + Codes64[x + 1]; end; end; if a > 0 then begin x := b shl (6 - a); Result := Result + Codes64[x + 1]; end; end;
#11
Escrito 03 abril 2010 - 12:13
Salud OS
#12
Escrito 03 abril 2010 - 02:01

#13
Escrito 04 abril 2010 - 05:45
Hey, he estado trabajando en lo mismo, pero en la cadena que colocas, a mi me aparece los siguiente
iCflad7c1gqlRSa1yy507ZtdtJ+WPGmx5duoqHaOkSymecQMJmLBjD6r3G/7isuJKR6QUQXjYteM9ppXcQ3K/
hxAhCFAXYjA9PIjWruqvftyLUobRSxraWdaQw3pH4IFq1MxgThd15P5xxTkmcEz34rM23/fdyTTip8PUJugUTy
Y no me queda el mismo resultado, utlizando el mismo archivo pem...
Para codificar en base64 utilizo el siguiente algoritmo que encontré:
Hola felipep, mejor intenta con esta porque usando cadenas de pascal a veces se cortan yo por eso ahora mejor la uso con bytes
function BinToBase64(const PDat: PBYTE; const DatLen: DWORD): string; const BaseTable: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var s, s1: string; i, p, len, n, Addnum: DWORD; PBin: PBYTE; begin result := ''; S := ''; addnum := 0; PBin := PDat; for i := 1 to DatLen do begin S := S + IntToHex(PBin^, 2); PBin := PBYTE(DWORD(PDat) + i); end; case (length(s) mod 3) of 0: addnum := 0; 1: begin s := s + '00'; addnum := 2; end; 2: begin s := s + '0'; addnum := 1; end; end; len := length(s) div 3; for i := 1 to len do begin s1 := midstr(S, i * 3 - 2, 3); p := strtoint('$' + s1); n := p div 64; result := result + basetable[n + 1]; n := p mod 64; result := result + basetable[n + 1]; end; if addnum = 1 then result := result + '=='; if addnum = 2 then result[length(result)] := '='; end;
Saludos
#14
Escrito 04 abril 2010 - 05:58
Tambien incluye para leer y escribir el xml con el sello, el numero y certificado público el cual se puede validar en esta aplicación del sat.
Saludos
Archivos adjuntos
#15
Escrito 04 abril 2010 - 07:52
Tambien incluye los headers par opssl (packages\openssl\src\openssl.pas).
No olviden pegarle un visazo siempre a la RTL y a la FCL que estan llenas de sorpresas.
Saludos.
#16
Escrito 04 abril 2010 - 10:54
Sólo tengo un problema que espero me puedas ayudar--- La función StrPCopy funciona con arreglos char; sin embargo la tienes con un arreglo de bytes y me marca error ¿Cómo pudiste hacerla jalar así?
Luego, las funciones LoadXMLFile(Doc, xmlOrigen) y WriteXMLFile(Doc, xmlDestino) no jalan en Delphi ¿De qué librería se obtienen?
Yo intenté con Nodo := Doc.DocumentElement.ChildNodes[1], pero no funciona con IDOMNode... De cualquier forma esto se puede resolver escribiendo directo en el XML con XMLDocument.
Y por último, si pudieras ayudarme, te lo agradecería tremendamente: en la función que mandaste para codificar de bin a base64, le debes poner un parámetro PByte, pero GetSello entrega ya sea un array de char o, en tu caso (sea como sea que lo hayas logrado hacer jalar), un arreglo de bytes... De cualquier forma sigo trabajando en esto...
Te agradezco mucho toda la ayuda que haz subido, ya que poca gente publicaría un trabajo así.
Saludos

#17
Escrito 04 abril 2010 - 11:19
Hola, muchas gracias por tu respuesta... He estado estudiando detenidamente los archivos que mandaste y han sido de gran ayuda.
Sólo tengo un problema que espero me puedas ayudar--- La función StrPCopy funciona con arreglos char; sin embargo la tienes con un arreglo de bytes y me marca error ¿Cómo pudiste hacerla jalar así?
Luego, las funciones LoadXMLFile(Doc, xmlOrigen) y WriteXMLFile(Doc, xmlDestino) no jalan en Delphi ¿De qué librería se obtienen?
Yo intenté con Nodo := Doc.DocumentElement.ChildNodes[1], pero no funciona con IDOMNode... De cualquier forma esto se puede resolver escribiendo directo en el XML con XMLDocument.
Y por último, si pudieras ayudarme, te lo agradecería tremendamente: en la función que mandaste para codificar de bin a base64, le debes poner un parámetro PByte, pero GetSello entrega ya sea un array de char o, en tu caso (sea como sea que lo hayas logrado hacer jalar), un arreglo de bytes... De cualquier forma sigo trabajando en esto...
Te agradezco mucho toda la ayuda que haz subido, ya que poca gente publicaría un trabajo así.
Saludos
Lo que pasa es que esta hecho para lazarus por eso a mi si me funciona. Si lo quieres para delphi checa este otro ejemplo de aquí de ahí copie el código de la función bin a base64.
Saludos
#18
Escrito 06 abril 2010 - 12:34

Salud OS
#19
Escrito 06 abril 2010 - 02:40
1. Entramos a http://www.sat.gob.mx/
2. Clic en “Comprobantes Fiscales”
3. Clic en “Comprobantes Fiscales Digitales”
4. Clic en “Información para contribuyentes que deseen emitir CFD por sus propios medios”
5. Clic en “Orientación y Aclaraciones”
6. Clic en “Lo más consultado”
7. Clic en “Nueva versión del Anexo 20”
Saludos
#20
Escrito 06 abril 2010 - 10:36
Y unos blogs con experiencias de quienes ya usan esto
http://technosat.wordpress.com/
http://blog.tufactura.me/
http://www.kauli.info/
Saludos