Generacion de Sello Digital paso a paso

Es tan comun este tema que he decidido abrir un foro especial para este caso. Se trata de programadores que tienen problemas para crear el Sello Digital y que no pasan la validacion
Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 11:34 am

He recibido muchos mensajes como este : Esta bien hecha mi cadena original? Mi digestion MD5 esta bien? Mi sello no valida, donde esta el error?

Antes que nada es MUY DIFICIL descubrir donde esta el error en SUS PROGRAMAS.

Voy ir paso a paso comentando como se calcula el sello y mostrando los resultados, ES MUY IMPORTANTE que alimenten estos resultados a sus propios programas y COMPAREN si estan identicos

Por supuesto que en donde haya una diferencia, bueno, hay un error.

OTRA GRAN RECOMENDACION: en el sitio de mauricio http://www.universolibre.org hay muy buena informacion tambien, les recomiendo darse una vuelta por alla.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 1:18 pm

PASO 0. Previo al sellado.

Anexo un archivo zip que contiene :

aaa010101aaa_csd_01.cer - Certificado de prueba, deben usar este mismo para seguir este tutotial
aaa010101aaa_csd_01.key - Llave privada de prueba
Contraseña de clave privada.txt - idem

OpenSSL (exe's y dll) - Libreria de criptografia para generar el sello

PRUEBA.xml - El CFD de prueba que vamos a firmar, tiene varias "trampas" que veremos mas adelante

EXTRAERLLAVEPRIVADA.bat - Explico a continuacion :

El primer paso es, por supuesto, crear un XML y extraer la llave privada, esto se hace con la instruccion que esta dentro de EXTRAERLLAVEPRIVADA.bat, al ejecutarlo se genera el archivo LLAVEPRIVADA.pem.txt, este ultimo representa la llave privada en formato PEM y ya sin la clave de acceso.

NOTA IMPORTANTE : Reza el dicho "ayudate que yo te ayudare", por falta de tiempo no voy a poner mucho detalle, espero que hagan un enorme esfuerzo y traten de digerir la informacion y la analicen.
Adjuntos
PASO0.zip
(692.05 KiB) Descargado 2344 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 4:16 pm

PASO 1 CREACION DE LA CADENA ORIGINAL

En el Anexo 20 esta la secuencia para formar la cadena original.

Hay dos formas de crear la cadena, una es "manual" agregando los datos uno por uno y separandolos con pipe y la otra es mediante una transformacion xslt.

Este metodo manual es el que vamos a ver aqui.

Nota: aunque menciono que es "manual" me refiero de todos modos que es con un programa, pero es "piedrita por piedrita", veamos :

Dice el Anexo 20:

EMPIEZA CON DOS "PIPES" .....

Cadena = ||

Listo, sigue con la version del CFD, en este caso es "2.0", recuerden siempre terminar con otro pipe

Cadena = ||2.0|

Seguimos, el siguiente atributo es la Serie

Cadena = ||2.0|ABC| (recuerden, estoy tomando los valores de PRUEBA.XML publicado en el post anterior)

El siguiente atributo es el folio

Cadena = ||2.0|ABC|1234|

etc etc etc, mas pasito a pasito no puedo....

IMPORTANTE, si un atributo no existe no es necesario ponerlo en la cadena, asi entonces obtenemos la siguiente cadena INICIAL, falta depurarla

Código: Seleccionar todo

||2.0|ABC|1234|2010-01-01T12:12:12|12345|2010|ingreso|Pago en una sola exhibicion|68.50|79.46|UCP090807ABC|UAMERO & Compañia SA de CV|Cuba|456|Col. Latinoamerica|Oaxaca|Oaxaca|Oaxaca|México|93736|MMC090909QWE |Mi Mejor Cliente SA de CV|Calle 5 de Mayo|345|Col. Bondojito|Guadalajara|Guadalajara|Guadalajara|México|48473|1|Pieza|Lapiz Berol     del      No. 2|2.50|2.50|12|Pieza|    Borrador Saga|5.00|60.00|3|Pieza|Pluma Bic Negra|2.00|6.00|IVA|16.00|10.96|10.96||


(incluyo el archivo zipeado, para que no tengan que copiar y pegar)
Adjuntos
CADENA PASO 1.txt
(464 Bytes) Descargado 1520 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 4:22 pm

PASO 2 APLICAR REGLA 5 DE LA FORMACION DE CADENA ORIGINAL

Esa regla 5 dice que no debe haber dos espacios seguidos, ni tampoco debe haber espacios antes o despues del "pipe", tampoco retorno de carro (CR char #13 ni #10)

Asi pues, dentro de su programa DEBEN quitar esos caracteres no permitos, en pseudocodigo seria :

Cadena = Remplaza(" "," ",cadena); "remplaza dos espacios por uno solo, es decir donde haya #20#20 lo remplaza con un solo #20"

Cadena = Remplaza(tabulador,"",cadena); "remplaza los tabuladores por cadena vacia"

Cadena = Remplaza(" |","|",cadena); "remplaza espacio+pipe y lo sustituye por un solo pipe

Cadena = Remplaza ("| ","|",cadena); "remplaza pipe+espacio y los sutituye por un solo pipe

Cadena = Remplaza(#13,"",cadena); "remplaza el caracter #13 (CR) y lo sustituye por vacio, es decir, lo quita"

Cadena = Remplaza(#10,"",cadena); "remplaza el caracter #10 (LF) y lo sustituye por vacio, es decir, lo quita"

Con eso la cadena que teniamos en el PASO 1 quedaria asi :

Código: Seleccionar todo

||2.0|ABC|1234|2010-01-01T12:12:12|12345|2010|ingreso|Pago en una sola exhibicion|68.50|79.46|UCP090807ABC|UAMERO & Compañia SA de CV|Cuba|456|Col. Latinoamerica|Oaxaca|Oaxaca|Oaxaca|México|93736|MMC090909QWE|Mi Mejor Cliente SA de CV|Calle 5 de Mayo|345|Col. Bondojito|Guadalajara|Guadalajara|Guadalajara|México|48473|1|Pieza|Lapiz Berol del No. 2|2.50|2.50|12|Pieza|Borrador Saga|5.00|60.00|3|Pieza|Pluma Bic Negra|2.00|6.00|IVA|16.00|10.96|10.96||


(NO COPIEN Y PEGUEN EL TEXTO, descarguen el archivo txt adjunto)
Adjuntos
CADENA PASO 2 (sin espacios extra).txt
(450 Bytes) Descargado 1352 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 4:35 pm

PASO 3 CODIFICAR LA CADENA ORIGINAL CON UTF8

Les platico rapidamente.....vivimos en un mundo con un monton de lenguas y sus respectivos alfabetos.

Antes de la globalizacion se usaba una tabla, llamada ASCII, para representar el alfabeto latino y asi obteniamos que por ejemplo la "A" tenia el codigo 65, la "B" el codigo "66" etc.

PERO, y si queriamos una eñe ? no habia representacion en esa tabla.

Bueno, entonces desarrollaron el UNICODE y pusieron la inmensa mayoria de los alfabetos del mundo en esa tabla, ES ENORME, y caracteres fuera de a..z y los numeros requieren DE DOS BYTES o mas para su representacion.

UTF8 segun wikipedia (editado para simplicidad)

UTF-8 es un formato de codificación de caracteres utilizando símbolos de longitud variable.

Sus características principales son:

Es capaz de representar cualquier carácter Unicode.
Usa símbolos de longitud variable (de 1 a 4 bytes por carácter Unicode).
Incluye la especificación US-ASCII de 7 bits, por lo que cualquier mensaje ASCII se representa sin cambios.


Digiriendo esto, LAS VOCALES ACENTUADAS, LA EÑE, EL AMPERSAND &, LA ARROBA @ Y muchos caracteres "raros" tienen que codificarse en UTF8 ANTES DE SELLAR.

Como se hace esto? mmmh tienen que buscarle en cada lenguaje que usan.

En DELPHI tenemos la instruccion UTF8Encode(cadena), asi pues solo tenemos que usar

CadenaOriginal := UTF8Encode(CadenaOriginal);

DETALLE IMPORTANTE: Windows XP en adelante son "compatibles" con UTF8 y detectan AUTOMATICAMENTE si un archivo tiene este tipo de caracteres, eso significa que NO LOS VAN A PODER VER EN EL BLOC DE NOTAS NI EN EL EXPLORER, eso debido a que Windows es un excelente sistema operativo (mmmh, no encuentro el emoticon con cara de vomito....) y hace la conversion sin que se entere uno.

Pero ya deben haber visto estos caracteres, se ven mas o menos asi :

UTF8.jpg
UTF8.jpg (25.71 KiB) Visto 34698 veces


Anexo la cadena ya codificada en UTF8, les insisto, programen sus sistema para que lea este txt y lo compare contra sus resultados, deben ser IDENTICOS

NOTA: El otro metodo de obtener la cadena original es aplicando una transformacion XSLT al archivo XML. BUSQUEN en el foro la palabra XSLT, hay incluso un ejemplo de codigo en Delphi
Adjuntos
CADENA PASO 3 (codificada en UTF8).txt
(453 Bytes) Descargado 1744 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 11, 2010 4:47 pm

[[[actualizado, por un error "de dedo" me brinque la numeracion, no existe el "paso 4"]]]
[[[no quiero renumerar los pasos ya que hay mensajes que hacen referencia a los pasos y puede haber mas confusion]]]

PASO 5 CALCULAR EL DIGEST DE LA CADENA ORIGINAL

Una vez que tenemos la Cadena Original hay que calcular su "Digest" o "Hash" o "Digestivo"

Para CFD con fecha 2010 o anterior se debe usar el Digest MD5

A partir del 2011 se debe usar el Digest SHA1

Anexo incluyo el *.bat para ejecutar el OpenSSL y que calcule estos valores.

La Instruccion dentro del *.bat es :

Código: Seleccionar todo

openssl dgst -md5 "CADENA PASO 3 (codificada en UTF8).txt" >"Digest MD5.txt"

openssl dgst -sha1 "CADENA PASO 3 (codificada en UTF8).txt" >"Digest SHA1.txt"


Y el Resultado son dos archivos de texto, uno para cada digest:

Código: Seleccionar todo

MD5(CADENA PASO 3 (codificada en UTF8).txt)= 4f4487e61b410caa58a19fb0e0f1e9f8


Código: Seleccionar todo

SHA1(CADENA PASO 3 (codificada en UTF8).txt)= ae8ccf6ae672b81c9a1f33557f87a6d2ddec02d4
Adjuntos
DIGESTION MD5 Y SHA1.zip
(237 Bytes) Descargado 1631 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Vie Nov 12, 2010 10:13 am

PASO 6 CALCULAR EL SELLO

La Instruccion para sellar CON MD5 es :

Código: Seleccionar todo

openssl dgst -md5 -sign LLAVEPRIVADA.pem.txt -out SelloBin.txt "CADENA PASO 3 (codificada en UTF8).txt"


Para sellar CON SHA1 es:

Código: Seleccionar todo

openssl dgst -sha1 -sign LLAVEPRIVADA.pem.txt -out SelloBin.txt "CADENA PASO 3 (codificada en UTF8).txt"


Aqui deben notar que se usa LLAVEPRIVADA.pem.txt que se obtuvo en en PASO 0

Esta instruccion genera un archivo SelloBin.txt que es el SELLO DIGITAL EN BINARIO

Anexo el *.bat con la instruccion mostrada
Adjuntos
SELLAR.zip
(213 Bytes) Descargado 1729 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Vie Nov 12, 2010 10:17 am

PASO 7 CONVERTIR EL SELLO BINARIO A BASE64

El Sello debe pasarse a Base64 que es un sistema en el cual se utiliza unicamente las letras del alfabeto, los numero y un par de caracteres adiciones (+ / =).

Se hace asi para que pueda imprimirme y pueda ser enviado por email.

La instruccion OpenSSL para hacer esa conversion es :

Código: Seleccionar todo

openssl enc -base64 -in SelloBin.txt -out Sello.txt


Con eso obtenemos un archivo llamado Sello.txt que tiene lo siguiente:

Código: Seleccionar todo

KGv1cS/Q6z2Fld35z5JjeJwbh33vstgkNIT83o2ScykNHNWbF9G1FrhZgdfeXJE0
CGV5mBBpC1BJvKG65NktTl2Cu/mmisyP+yrgiUW78oQmYcEN/A3uXiv2IIj2SsY8
e+dEfwOct+RORY0t8YgHeUJeFpcye+pVZzNrwoNCJqE=


Por ultimo hay que tomar ese sello y agregarlo al XML y voila! a validarlo para ver si todo esta bien.

Espero les sea util este tutorial................. :)
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!

Avatar de Usuario
ironman
Mensajes: 69
Registrado: Jue Nov 25, 2010 12:33 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor ironman » Jue Nov 25, 2010 3:36 pm

Yo tengo una duda...

En el paso 6 donde se calcula el sello, no veo una referencia al archivo generado en el paso 5 "Digest MD5.txt". Aun mas, no veo después del paso 5 en dónde se emplea este archivo...

¿ Tiene alguna utilidad generar esto ?

A mi entender, la cadena original en formato UTF-8 es suficiente para generar el sello, siendo innecesario el paso 5.

Por favor, confirmen mi testis o corrijanme si me equivoco. Saludos !

Avatar de Usuario
Dado
Mensajes: 15824
Registrado: Mar Jul 06, 2010 8:56 pm

Re: Generacion de Sello Digital paso a paso

Mensajepor Dado » Jue Nov 25, 2010 3:53 pm

ironman escribió:Yo tengo una duda...

En el paso 6 donde se calcula el sello, no veo una referencia al archivo generado en el paso 5 "Digest MD5.txt". Aun mas, no veo después del paso 5 en dónde se emplea este archivo...

¿ Tiene alguna utilidad generar esto ?

A mi entender, la cadena original en formato UTF-8 es suficiente para generar el sello, siendo innecesario el paso 5.

Por favor, confirmen mi testis o corrijanme si me equivoco. Saludos !


Exacto!! A personas como tu es a las que me gusta asesorar. Porque cuestionan, investigan.....

Es correcto, el archivo que se genera en el paso 5 no se deberia hacer, es superfluo aunque ayuda a la depuracion.

Lo que sucede es que en el paso 6 se hace el HASH Y EL SELLADO al mismo tiempo, en una sola instruccion, pero quise irme "por las piedritas" y explicar que despues del UTF8 hay que digerir con MD5/SHA1 y despues sellar.

El paso 5 aunque no es necesario hacerlo (porque en el paso 6 ya esta incluido) es bueno obtener ese dato para compararlo y ver si todo va bien. Claro que cuando ya estemos en produccion podemos omitirlo.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!


Volver a “SELLO DIGITAL INVALIDO”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados