SoloCodigo
Programación Específica => Diseño de Algoritmos => Mensaje iniciado por: edugza en Viernes 16 de Julio de 2010, 17:31
-
Hola Francisco esta excelente tu aportación lo único es que no se como obtienes el MD5 tengo una factura electrónica con todo y certificado y lo introduzco en el validador y me da el mismo MD5 que me da el openssl lo que si cambié fue que la cadena original en lugar de grabarla como UTF8 la puse como ANSI la cadena que estoy validando es:
||2.0|FAXA|051661|2006-11-20T08:50:48|2951|2006|ingreso|EL PAGO DE ESTA FACTURA (CONTRAPRESTACION) SE EFECTUARA EN UNA SOLA EXHIBICION SI POR ALGUNA RAZON NO FUERA ASI EMITIREMOS LOS COMPROBANTES DE LAS PARCIALIDADES RESPECTIVAS|43824.69|0|50398.39|FJC780315E91|FABRICA DE JABON LA CORONA S.A. DE C.V.|CARLOS B. ZETINA|80|INDUSTRIAL XALOSTOC|ECATEPEC DE MORELOS|ECATEPEC|MEXICO|MEXICO|55348|CARLOS B.ZETINA NO.80|XALOSTOC EDO. DE MEXICO|XALOSTOC EDO. DE MEXICO|EDO. DE MEXICO|MEXICO|55348|NWM9709244W4|NUEVA WAL-MART DE MEXICO SRL DE CV|NEXTENGO|78|STA. CRUZ ACAYUCAN|AZCAPOTZALCO|AZCAPOTZALCO|DISTRITO FEDERAL|MEXICO|2770|22|TEPEYAC 25P 400 G C/ENV|110.97|2441.34|11|ZOTE AZUL 25P 400 G.|110.97|1220.67|22|ZOTE BCO. 25P 400 G|110.97|2441.34|7|ZOTE BCO. 50P 200 G|110.97|776.79|44|ZOTE ROSA 25P 400 G|110.97|4882.68|6|ZOTE ROSA 50P 200 G|110.97|665.82|12|ROMA 4P 5 KGS|218.34|2620.08|24|ROMA 10P 2 KGS|219.74|5273.64|120|ROMA 10P 1 KG|111.29|13354.20|12|FOCA 10P 2 KGS|233.87|2806.38|10|BLANCA NIEVES 10P 2 KGS|201.47|2014.65|40|BLANCA NIEVES 10P 1 KG|102.15|4086.00|5|BRILOZA 10P 1 KG|102.15|510.75|6|FOCA 12B 1LT|121.73|730.35|IVA|15.00|6573.70|6573.70||
lo grabo en un archivo con el notepad como tipo ANSI
le aplico el OPENSSL
openssl dgst -MD5 ansi.txt
MD5(ANSi.txt)= 907327b350082d1d40e0f3787db973e8
este MD5 es el mismo que se obtiene en la siguiente liga:
wwww.lacorona.com.mx/fortiz/sat/xsl.php
Podrías explicarme como obtuviste tu MD5.
Saludos y nuevamente felicidades por tu excelente artículo.
-
Bueno es posible que algun caracter no imprimible este en tu archivo o la marca de final de archivo (EOF) he agregado una herramienta para quitar ese caracter he intentado utilizar solo linea de comando por eso he agregado mas aplicaciones de msdos las cuales no son mias en el archivo bat esta la direccion web de los respectivos autores yo solo las he juntado.
El Md5 que estaba ahi yo lo genere en PHP y era el mismo que me mostraba el validador.
Saludos
-
Olvidaba el formato de la cadena original debe estar en utf8 asi lo marca el procedimiento ademas no debe de contener saltos de linea ni espacio entre \"pipes\" porque logicamente eso alterara el hash
Saludos
-
Ola amigo en serio gracias por el aporte me sirvo bastante...pero sabes cual es el comando para generar el sello digital con openssl....mira tengo este..pero no me sale igual...
$digital_sign_command = \'C:\\OpenSSL-Win32\\bin\\openssl.exe dgst -md5 -sign C:/SAT/keys_space/SpaceAduanas1.pem -out C:/FoxServ/www/examples/space_facturacion/sellos/md5.txt C:/FoxServ/www/examples/space_facturacion/sellos/cadena_original.txt | C:\\OpenSSL-Win32\\bin\\openssl.exe enc -base64 -in C:/FoxServ/www/examples/space_facturacion/sellos/md5.txt -out C:/FoxServ/www/examples/space_facturacion/sellos/sello_base64.txt\';
yo lo hago en php
-
el Zip contine:
* una version de OpenSSL (http://es.wikipedia.org/wiki/OpenSSL)
* un certificado (.CER) digital de prueba proporcionado por el SAT (http://www.sat.gob.mx/)
* una clave privada (.KEY) tambien proporcionada por SAT
* contraseña de la clave privada en .TXT
* una cadena original de ejemplo en UTF8 .TXT
* el hash de la cadena en Md5 .TXT
* una imagen con el procedimiento que describe el SAT
* un archivo de s c r i p t de windows .CMD que genera el sello digital usando OpenSSL
* un Sello valido y un acceso al validador en linea del SAT (utilizando el mismo certificado que incluye el zip)
Si el procedimiento es correcto segun lo describe SAT esto no deberia dar problemas sin embargo el sello generado por OpenSSL no es valido (segun el validador) pero he realizado pruebas con otro software en todos obtengo el sello que me da OpenSSL y si se le aplica verificacion da como correcto asi que estoy dudando de que el validador sea correcto o el proceso descrito por SAT no lo es y estan olvidando pasos!.
El otro metodo que he utilizado es PBCrypto en power builder 10 con las librerias
Bouncy Castle (http://www.bouncycastle.org/) (Java)
Saludos
[16 Jul 2010]==============================
He agregado algunas otras herramientas que pueden ser de utilidad ya que se esta usando la linea de comando
* aplicacion para remover la marca EOF del archivo
* aplicacion para generar el hash MD5
* aplicacion para quitar el nombre del archivo que le coloca MD5.exe o el propio OpenSSL dgst -md5
Autor: Francisco Tanori / Foros
http://www.ingenieria-soporte.com (http://www.ingenieria-soporte.com)
-
Muchas gracias Francisco Tanori por tan buen aporte obtuve la ayuda que me faltaba para la obtención del sello digital después de haber batallado cerca de 15 hrs... ¡Gracias!
-
Como agradecimiento a la ayuda que he recibido de toda la comunidad en estey otros foros con gusto les puedo compartir info de cómo generar el sello digital con PHP
-
Amigo plussmx<br><br>
te comparto el código PHP para la generación del sello digital:
<?php
/* Definimos donde esta el key en formato PEM */
$key=\'aaa010101aaa_CSD_01.key.pem\';
/* Introducimos la cadena original provista por el SAT */
$cadenaoriginal=\'||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||\';
/* Transformamos la cadena a UTF8 */
$cadena = utf8_encode($cadenaoriginal) ;
/* Hacemos un echo para ver la cadena en UTF8 (no es necesario pero es para ir paso por paso) */
echo \'<h5>UTF8</h5>\'.$cadena;
/* Hacemos un echo para ver la cadena en MD5 aquí obtenemos el mismo resultado que el SAT */
$cadena=md5($cadena);
echo \'<h5>MD5</h2>\'.$cadena;
/* Aquí lo que hacemos es escribir un txt (md5.txt) con la digestión MD5 para usarlo en el sellado */
$fp = fopen (\"md5.txt\" \"w+\");
fwrite($fp $cadena);
fclose($fp);
/* Aquí sellamos con el MD5 con el key para obtener el sello y guardarlo en sello.txt */
$hola1=shell_exec(\'\"C:\\Archivos de programa\\GnuWin32\\bin\\openssl.exe\" dgst -out C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.binario -sign C:\\wamp\\www\\en-trega\\fiscal-soft\\aaa010101aaa_CSD_01.key.pem C:\\wamp\\www\\en-trega\\fiscal-soft\\md5.txt\');
$hola2=shell_exec(\'\"C:\\Archivos de programa\\GnuWin32\\bin\\openssl.exe\" enc -in C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.binario -a -A -out C:\\wamp\\www\\en-trega\\fiscal-soft\\Firma.base64\');
/* Aquí mostramos el sello que en teoría debería ser el correcto */
echo \"<h5>Seal</h5>\";
//$hello=readfile(\"sello.txt\");
$hello=readfile(\"Firma.base64\");
echo \"<br>\".$hola1.\" \".$hola2.\" \".$hello.\"<br>\";
?>
Saludos!!
-
Hola Francisco:
Antes que nada agradezco tu aporte me a aclarado algunas dudas.
Respecto al archivo si voy a la página de validación del SAT: https://www.consulta.sat.gob.mx/SICOFI_WEB/ModuloECFD_Plus/ValidadorComprobantes/Validador.html
Con el archivo xml y el archivo CER me dice que el sello es valido. El sello que tiene este archivo xml es el siguiente:
UlUSwGNEicfigV6i4RhTy0eb2RYWFYyFatJFcM/u5Wlkb5XRxXiCizTGw5Yxz9oZNk8msAgO4C5Gevjh+S2TJPZueYhaQeZlo6k0rE3CQexkOGVRpHkvAoAgOM5kGKzYe24DKZbTgjNL+ai+tbhEHmRAFcpv2rDpehbL3w6BnYU=
Ahora al intentar generar este sello con el archivo KEY y el MD5.txt de tus archivos muestra me genera el siguiente sello:
GrO5fVxXDbmHbjrELI1j2OsVZqSLt4GLcESB8r4lprASJ/jrNWzsL4HyUMFMQQMUdDIBUuqqlam0+yZLstMC3n0G8Cl1clepXcjUJhzPnlKdjRGoCE5KiSKBUiEeXlOjwVdnhnIKdNnHtZUbfQhzRrsrN40UzAH1lrnqLLdbFjI=
El comando que uso:
openssl dgst -sign archivo.pem md5.txt | openssl enc -base64 -a -A > sello.txt
Lo curioso es que este sello lo generaba en Linux al tratar de hacerlo en Windows(XP/7) con los archivos que proporcionas me daba otro totalmente diferente:
2XZhPGVaS4h0xx5AGBOrTgpaGmnBJ16+jkDgD1vD+TvOKxSdJNTHATtr4F38Lr0GRJA5KbJq5UEiSRXSKeUJaIOG8BLTQmDNsVbsEqD5bk97LABVIaGZor8i8HaF1qdV3ymV1Dz15rGeWWcuUyQQLI1tuOpi6se8EBRLMYVWNz4=
Después caí en la cuenta de que estaba usando la versión 1.0.0a del openssl en Linux y tu tienes la 0.9.8 para Windows probe la 1.0.0a para Windows y ahora si obtengo los mismos sellos tanto en Linux como en Windows solo que no es el mismo de tu archivos xml de muestra.
¿Tendrás alguna idea de por que?
Agradezco cualquier comentario.
Un abrazo
-
Hola de nuevo...
Por fin he obtenido un sello digital valido. El secreto esta en al forma en que se pasan los parámetros:
xsltproc cadenaoriginal_2_0.xslt factura.xml | openssl dgst -md5 -sign archivo.pem | openssl enc -base64 -A > sello.txt
cadenaoriginal_2_0.xslt = archivo descargado de la página del SAT que sirve para extraer la cadena original http://www.sat.gob.mx/sitio_internet/cfd/2/cadenaoriginal_2_0/cadenaoriginal_2_0.xslt
factura.xml = archivo de la factura ya en formato xml en este momento no es necesario que contenga los datos del certificado o el sello estos se pueden agregar después.
archivo.pem = archivo con la clave privada para firmar en formato PEM
sello.txt = el sello digital
PENDIENTES:
Encontrar la forma de hacer los pasos separados y nos de el mismo resultado
Poder usar los XSLT sin conexión a Internet
Ojala les sirva.
Saludos
-
Hola...
He podido generar los CFD sin problemas completamente cualquier duda al respecto con gusto los podemos ayudar en el siguiente foro: http://www.validacfd.com/phpbb3/index.php
Saludos