Página 1 de 6
Como validar "a mano" un sello digital
Publicado: Mié Jul 07, 2010 9:26 am
por Dado
Para validar el sello se requiere tener el archivo XML y el certificado.
1. Tomas la cadena "Certificado" de tu XML, la DIVIDES en lineas de 64 caracteres cada una, despues le agregas el encabezado -----BEGIN CERTIFICATE----- y el pie -----END CERTIFICATE----- (el numero de guiones y la frase debe ser EXACTA), en caso que el XML no tenga el certificado puedes descargarlo de un sitio del servidor del SAT
2. Grabas ese certificado en un archivo, digamos "certificado.PEM" (no voy a explicar muchos detalles, pero donde veas negrillas es porque hay informacion que debes estudiar si quieres saber que esta pasando)
3. Toma la cadena "Sello" de tu XML, la DIVIDES en lineas de 64 caracteres y la grabas en archivo con nombre digamos "sello.txt"
4. Generas la cadena original (esta te la tienes que aventar "a mano", es decir, no esta en el XML) y la grabas en un archivo, digamos "cadena.txt" IMPORTANTE no se te olvide grabarla codificada con UTF8
5. Ejecutas lo siguiente :
openssl x509 -in "cert.PEM" -pubkey -noout >pubkey.txt
(para obtener la llave publica)
openssl enc -base64 -d -in "sello.txt" >sellobin.txt
(para pasar el sello de base64 a binario)
openssl dgst -md5 -verify "pubkey.txt" -signature "sellobin.txt" "cadoriginal.txt" >resultado.txt
(aqui esta toda la magia, en el archivo "resultado.txt" tienes......el resultado)
_________________________________________________________________
ACTUALIZACION, a partir del 2011 debes usar SHA1 asi :
openssl dgst -sha1 -verify "pubkey.txt" -signature "sellobin.txt" "cadoriginal.txt" >resultado.txt
(aqui esta toda la magia, en el archivo "resultado.txt" tienes......el resultado)
Re: Como validar "a mano" un sello digital
Publicado: Mié Jul 07, 2010 9:29 am
por Dado
Continuado con la validacion "a mano" del sello digital:
Hay un paso intermedio que "no se ve" pero te puede ayudar a depurar.
Puedes obtener el MD5 de la siguiente forma:
openssl dgst -md5 "cadena.txt" >md5.txt
Con eso puedes comparar el md5 que estas obteniendo con el md5 que reporta el validador del sat, si no son igual entonces hay un error en la formacion de la cadena original.
Algo MUY PERO MUY importante, muchas veces al grabar la cadena se le insertan caracteres invisibles, como retorno de carro (#13) o fin de archivo (ctrl-z, eof) etc
Es importante que se grabe la cadena original asi (codigo en Delphi)
var arch : textfile;
assignfile(arch,"cadena.txt);
rewrite(arch)
write(arch,utf8encode(cadena)); <<<< SIN writeln, solo "write", tambien prueba con y sin el utf8encode
closefile(arch)
Re: Como validar "a mano" un sello digital
Publicado: Lun Ago 16, 2010 1:16 pm
por kontrol
Hola dado
Siguiendo el mensaje por aqui... Tengo algunas dudas, paso por paso.
1. Tomas la cadena "Certificado" de tu XML, la DIVIDES en lineas de 64 caracteres cada una, despues le agregas el encabezado -----BEGIN CERTIFICATE----- y el pie -----END CERTIFICATE----- (el numero de guiones y la frase debe ser EXACTA), en caso que el XML no tenga el certificado puedes descargarlo de un sitio del servidor del SAT
Entonces tomo la cadena, ¿pero no entiendo a qué te refieres con dividir? ¿Es un salto de línea? Entonces ese archivo quedará:
-----BEGIN CERTIFICATE-----
CERTIFICADO LINEA 1 CON 64 CARACTERES
CERTIFICADO LINEA 2 CON EL RESTO DE CARACTERES
-----END CERTIFICATE-----
3. Toma la cadena "Sello" de tu XML, la DIVIDES en lineas de 64 caracteres y la grabas en archivo con nombre digamos "sello.txt"
¿Mismo caso que el anterior, un salto de línea cada 64 caracteres?
Re: Como validar "a mano" un sello digital
Publicado: Lun Ago 16, 2010 1:46 pm
por Dado
Casi, solo que seria asi :
-----BEGIN CERTIFICATE-----
CERTIFICADO LINEA 1 CON 64 CARACTERES
CERTIFICADO LINEA 2 CON 64 CARACTERES
CERTIFICADO LINEA 3 CON 64 CARACTERES
CERTIFICADO LINEA 4 CON 64 CARACTERES
etc
-----END CERTIFICATE-----
Es, como dices al final, un salto de linea cada 64 caracteres.
Re: Como validar "a mano" un sello digital
Publicado: Lun Ago 16, 2010 1:51 pm
por kontrol
Seguí investigando y encontré que la respuesta es SI.
Seguí todos los pasos (a mi parecer correctamente) y llegué al último punto y dice
unable to load key file
error in dgst
¿Alguna idea que puede ser lo que detone este mensaje? Todo apunto al certificado.pem, talvez algo me falta para la correcta generación de éste. Lo extraño es que usé un PEM que cree una vez anterior con otro fin, y me apareció el mismo mensaje de error
dgst -md5 -verify "pubkey.txt" -signature "sellobin.txt" "cadoriginal.txt" -out "resultado.txt"
Re: Como validar "a mano" un sello digital
Publicado: Mié Sep 01, 2010 10:24 pm
por Dado
Todos los archivos (certificado.pem, y los *.txt) puedes abrirlos con el bloc de notas.
Abrelos y checa que mas o menos corresponda la informacion.
Tambien asegurate que el OpenSSL.bat este en el mismo directorio que pubkey.txt o agregale la ruta completa a los archivos
Re: Como validar "a mano" un sello digital
Publicado: Lun Sep 20, 2010 5:13 pm
por lordcold
Saludos.
He realizado los pasos que describen en el post original, he realizado varios intentos de validar el sello de la factura pero hasta ahora lo unico que obtengo en el archivo resultado.txt es "Verification Failure".
Me queda la duda de saber que estoy haciendo mal y como puedo resolver esto, hasta este punto entiendo que he obtenido bien la llave publica del certificado, pero aún así no estoy 100% seguro, pero me queda duda si la codificación en utf-8 de mi cadena original es correcta, también no estoy seguro del resultado de la decodificación del base64, he realizado la decodificación con php, openssl y en una página web con resultados diferentes

.
Mucho les agradeceré me puedan ayudar con esto, siento que estoy cerca de lograr la validación.
Gracias.
Re: Como validar "a mano" un sello digital
Publicado: Lun Sep 20, 2010 8:42 pm
por Dado
Bueno, sin los archivos que generas es muy dificil decirte donde esta el error.
Anexo aqui una factura generada por Office Depot junto con TODOS los archivos auxiliares como cadenaoriginal.txt sello.txt sellobinario.txt etc etc
Haz tus pruebas usando esta factura y compara los resultados, en el punto en el que tengas una diferencia entonces ahi hay un error.
Y aqui viene mi publicidad........si de plano no puedes resolverlo te puedo ofrecer asesoria personalizada, puedo revisar tus archivos y tus procedimientos y asesorarte hasta que consigas validar con exito. Mis servicios son muy economicos, si te interesa mandame un email a la direccion que aparece en mi firma.
Ahora, esto no significa que no puedas seguir recibiendo ayuda gratuita por parte del foro, si hay alguien que tenga alguna recomendacion el comentario es bienvenido.
Re: Como validar "a mano" un sello digital
Publicado: Mar Sep 21, 2010 9:54 am
por lordcold
Saludos.
Muchas gracias por tu respuesta, que versión de openssl estás usando?, yo tengo la 0.9.7m bajo HP-UX 11.11, tendré que actualizar?
¿Podrías publicar los comandos que usaste para generar los archivos adjuntos de tu post?
Gracias de nuevo.
Re: Como validar "a mano" un sello digital
Publicado: Mar Sep 21, 2010 10:34 am
por Dado
La version que uso es la 0.9.8b May 2006
Aunque no creo que la version sea importante, es mi opinion.
De los comandos que uso estan en el primer mensaje de este hilo, la mayoria de los archivos los genero con un programa, por ejemplo la cadena original la genero usando funciones de XML y cadenas, el OpenSSL NO GENERA XML's o Cadenas Originales