Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


CARTA PORTE V3.1

ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03


.

Sello de 25 caracteres, esta bien asi?

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
Araceli
Mensajes: 76
Registrado: Mié Nov 03, 2010 6:25 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Araceli »

Yo no uso el openssl para firmar
pero creo q es incorrecto que modifiques el sello una vez que lo generas

¿aqui ya esta generado el sello ??
o sea,
¿ya firmaste tu cadena original y te dio como salida el archivo sello.txt???

Código: Seleccionar todo

Sello = AbrirArchivoTexto("C:\informes_sat\Sello.txt")
Certificado = AbrirArchivoTexto("C:\informes_sat\cer.txt")
Entonces aqui ya no deberias quitarle nada

Código: Seleccionar todo

Sello = Replace(Sello, Chr(10), "")
Sello = Replace(Sello, Chr(13), "")
Y acá tampoco ya no tendria sentido que modifiques el certificado, porque
ya se usó lineas arriba

Código: Seleccionar todo

Certificado = Replace(Certificado, "-", "")
Certificado = Replace(Certificado, " ", "")
Certificado = Replace(Certificado, "END", "")
Certificado = Replace(Certificado, "BEGIN", "")
Certificado = Replace(Certificado, "CERTIFICATE", "")
Certificado = Replace(Certificado, Chr(10), "")
Certificado = Replace(Certificado, Chr(13), "")

Código: Seleccionar todo

CrearXML(Val(LblOperacion.Text), 1, 232323, 2010, Sello, Certificado)


Me atrevo a asegurar que eso deberias hacerlo antes de mandar firmar
No comprendo del todo el funcionamiento del open ssl
pero creo que esa modficacion deberia ir por aqui

Código: Seleccionar todo

Shell("C:\OpenSSL\bin\openssl.exe x509 -inform DER -in c:\informes_sat\Certificado.cer -out c:\informes_sat\Cer.txt")

[b]Certificado = AbrirArchivoTexto("C:\informes_sat\cer.txt"
Certificado = Replace(Certificado, "-", "")
Certificado = Replace(Certificado, " ", "")
Certificado = Replace(Certificado, "END", "")
Certificado = Replace(Certificado, "BEGIN", "")
Certificado = Replace(Certificado, "CERTIFICATE", "")
Certificado = Replace(Certificado, Chr(10), "")
Certificado = Replace(Certificado, Chr(13), "")

guardarCertificado(Certificado)  //o algo asi

//y luego todo lo demas  (bueno eso creo, a reserva de lo que opinen los expertos en openssl
[/b]

Shell("C:\OpenSSL\bin\openssl.exe pkcs8 -inform DER -in c:\informes_sat\Certificado.key -passin pass:a0123456789 -out c:\Informes_sat\llave.pem.txt")
Shell("C:\OpenSSL\bin\openssl.exe dgst -md5 -sign c:\informes_sat\llave.pem.txt -out c:\informes_sat\SelloBin.txt c:\informes_sat\cad.txt")
Shell("C:\OpenSSL\bin\openssl enc -base64 -in C:\informes_sat\SelloBin.txt -out C:\informes_sat\Sello.txt")
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Dado »

@Araceli

Disculpa que te contradiga, pero cbr_net si esta bien, debe modificar el sello y el certificado.

La cosa es que OpenSSL por una razon que tiene que ver con la conversion a base64 SIEMPRE arroja los resultados acomodados en lineas de 64 caracteres, por ejemplo el sello lo calcula asi :

Código: Seleccionar todo

SELLO CALCULADO CON OPENSSL :

U7AVS/+BTPKFXEQlH2U6vlAfvA656alkv3KQjZZozjRrWLkeTtaLcojh0w2qiUju CRLF
sp8zIAWdd50PNZ7z1Z4KL8VKbQaVeWqQXyylFuIdaxgb2PqyWZ53WVqI9RUO0EyN CRLF
1s1cytzKU4VTUx8bTZ+2vsSgdFuctyMiZx4HC0gKEpY= CRLF

(puse "CR" "LF" para remarcar la idea que al final de cada linea pone esos dos caracteres invisibles)
y en el caso del certificado lo muestra en formato PEM que no es otra cosa que base64 pero con encabezados

Código: Seleccionar todo

CERTIFICADO EXTRAIDO CON OPENSSL:

-----BEGIN CERTIFICATE-----
MIIEPTCCAyWgAwIBAgIUMDAwMDEwMDAwMDAxMDAyNTY2NjkwDQYJKoZIhvcNAQEF CRLF
BQAwggE2MTgwNgYDVQQDDC9BLkMuIGRlbCBTZXJ2aWNpbyBkZSBBZG1pbmlzdHJh CRLF
Y2nDs24gVHJpYnV0YXJpYTEvMC0GA1UECgwmU2VydmljaW8gZGUgQWRtaW5pc3Ry CRLF
YWNpw7NuIFRyaWJ1dGFyaWExHzAdBgkqhkiG9w0BCQEWEGFjb2RzQHNhdC5nb2Iu CRLF
....
tgHd0fLNO8/M0weSiTLtmNl7duqdoH2f++kNv1A7L3R21k0n6EYeN8asOxeUXwVo CRLF
1HxVuBlnZe7MtdI6tdG6BjtNO4RdXs9Mv8jbf1N2+mlx CRLF
-----END CERTIFICATE-----
Y por eso tiene que quitar los encabezados "----BEGIN CERTIFICATE --- " Y "------END CERTIFICATE----"

Ahora te entiendo que "no debes tocar el sello", claro, si te equivocas y le pones o quitas un caracter pues lo estas echando a perder, pero en este caso es indispensable.....

@cbr_net

A "ojo de buen cubero" tu codigo para el calculo del sello esta bien, ya no encuentro algo a simple vista de porque no valida tu sello, siento no poder ayudarte mas por eso ya no conteste tu mensaje......
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
Araceli
Mensajes: 76
Registrado: Mié Nov 03, 2010 6:25 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Araceli »

no sabia eso de las lineas, entonces desdigo lo que dije

pero como me dio curiosidad ese codigo lo revise de nuevo y ahora tengo una sospecha:

¿Sera que lo que hace con el .key antes de mandar firmar no lo hace bien?

Supongo que aqui abre el key con su password

Código: Seleccionar todo

Shell("C:\OpenSSL\bin\openssl.exe pkcs8 -inform DER -in c:\informes_sat\Certificado.key -passin pass:a0123456789 -out c:\Informes_sat\llave.pem.txt")
y como depende de un comando externo, sospecho que aun no termina de ejecutarlo, cuando ya esta llamando a la siguiente linea de codigo

creo que le falta un "timer" o no se como se le llame en visual basic, porque tal vez aun no termina de generar el archivo "llave.pem.txt", cuando ya lo esta queriendo usar en la siguiente linea

tal vez sirva un messagebox("Se esta generando el sello"), asi mientras el usuario da click, se termina de generar el archivo "llave.pem.txt"

Código: Seleccionar todo

Shell("C:\OpenSSL\bin\openssl.exe dgst -md5 -sign c:\informes_sat\llave.pem.txt -out c:\informes_sat\SelloBin.txt c:\informes_sat\cad.txt")
Shell("C:\OpenSSL\bin\openssl enc -base64 -in C:\informes_sat\SelloBin.txt -out C:\informes_sat\Sello.txt")
Araceli
Mensajes: 76
Registrado: Mié Nov 03, 2010 6:25 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Araceli »

casi estoy 100% segura que ese es el problema, porque se parece mucho a la forma en q powerbuilder maneja sus
eventos con triggerevent()
... aun no termina de ejecutarse un evento cuando ya comenzo a ejecutarse la secuencia del segundo y asi sucesivamente
y una manera de corregirlo es con postevent, obligandolo a que se sume a la "cola", pero
no sabria como programar eso en visual basic, excepto con el truco del messagebox, asi retienes un poco el flujo de
ejecucion


Saludos
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Dado »

Araceli escribió:casi estoy 100% segura que ese es el problema, porque se parece mucho a la forma en q powerbuilder maneja sus
eventos con triggerevent()
... aun no termina de ejecutarse un evento cuando ya comenzo a ejecutarse la secuencia del segundo y asi sucesivamente
y una manera de corregirlo es con postevent, obligandolo a que se sume a la "cola", pero
no sabria como programar eso en visual basic, excepto con el truco del messagebox, asi retienes un poco el flujo de
ejecucion


Saludos

Es cierto, no esta dando tiempo al (comando externo) openssl de terminar su trabajo cuando ya esta llamando a la siguiente instruccion.

Aver cbr_net por aqui hay una pista, dale un poco de tiempo entre instrucciones para ver si con eso consigues un sello correcto
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
cbr_net
Mensajes: 125
Registrado: Mar Nov 23, 2010 1:08 pm
Ubicación: Puebla

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por cbr_net »

Hola!!!

Mil gracias de nuevo por todo, comento lo que me paso... jejeje algo muy tonto pero bueno esos errores logicos son los mas dificiles de encontrar y experimentando con metodos nuevos pues sencillamente se revuelve todo... mil graicas a mi profesor de algoritmos y estructura de datos!!! siempre me decia ve a las bases, correlo a mano y sabras que falla...

Tambien mil gracias a Dado y a Mauricio sin su ayuda muy poco abria hecho en este momento, y aunque me falta mucho por programar creo que me quedan mas claros los terminos y estandares de cryptologia graicas por hacerme leer!!

Bueno les comento que el error lo tenia al regenerar mi XML ya que todo el proceso estaba bien pero en mi desarrollo para incrustar el sello y certificado volvia a generar el XML CON OTRA HORA DISTINTA jajajaja, soy un burro!!!! y bueno como consecuencia la cadena original cambiaba y tambien no validaba nada....

Por eso hay que tener cuidado con los "reprocesos"... jajaja :mrgreen:

Con la duda de quitar del certificado el ----- BEGIN CERTIFICATE ------- y el END, SI!! si se tienen que quitar junto con los caracteres #10 y #13 lo mismo con el sello.... todo esto despues de generados para que no haya problema en la extraccion de esta informacion.

Ahora con los detalles de VB.net al procesar comandos... Tener cuidado como bien comentaron la instruccion shell se debe de programar para que espere a que termine el proceso llamado y OJO esta instruccion no procesa dos comandos en una sola linea.

Bueno espero haber contribuido con mi granito de arena con estas observaciones que en lo personal me costo mucho tiempo resolver ya que como les comente no solo era un problema sino una serie de "detalles" que bueno solo se detectan al leer y enterder el proceso, comandos y obviamente como se comporta tu lenguaje de programacion con todas estas conbinaciones...

Si hay algo en lo que les pueda ayudar no duden en contactarme a mi correo personal...

Gracias de nuevo Dado, Mauricio y a toda la comunidad que me aporto algo con sus comentarios, estoy convencido de que solo podremos salir adelante como pais si las personas compartimos conocimento, claro que no todo en clarola de plata por que no se valora.. ok??? :geek:

Saludos y nos estamos leyendo!!
jblancas
Mensajes: 3
Registrado: Mar Dic 07, 2010 11:50 am

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por jblancas »

Que tal señores,

Tengo una duda parecida al tema que ya discuten, estoy implementando la firma electrónica para documentos en una aplicación. Utilizo la librería Chilkat para .net. El proceso es el siguiente:

1.- Aplicar Hash con MD5 a una cadena.

CadenaOriginal:

1|02/12/10|BAGJ850909|1|TECLADO|100.00|5|500.00|500.00|80.00|580.00

HashCadena: 497EC4EFC0BD0391936A6CEC336AEE3E

2.- Firmar con llave privada (*.key) es decir, firmar HashCadena (497EC4EFC0BD0391936A6CEC336AEE3E) con
SHA-1 y el resultado codificado en hexadecimal.

resultado firma:

F81012BA21423D51BE66A3BF241E24AE04966058906A510815D164FF3A4687AD917DAD4BC13135F051881DB7EFCE7EA12299A14F97715A629F427AED8A3C7E4D2AAEE8A4E4A4484B33870644C14C455D80B6DE9B590DECD5F47AC072352C6F41AFBF80AC48D27D15A7C3059A57FC4AB7AAD0B4BCEDAC2FC42A9C92D51E449117


Como ven el resultado de la firma es muy grande (250 caracteres), y no me quedo tranquilo...mi duda es sobre la longitud de la firma. Saber si esta longitud es constante o variable. Entiendo que estoy cifrando un texto y el tamaño de la firma dependerá del texto a firmar.

Para estar seguro necesito validar que la firma que imprima en un documento es correcta, se me ocurre que la mejor forma es comparar la firma que genera otra aplicación para la misma cadena de texto a firmar...

¿conocen alguna aplicación en linea que permita firmar con el (*.key) y nos de la cadena resultante de la firma?, así podría compararla visualmente con la que genero y definir si esta firma es igual que la firma que genera otra aplicación...

Si tienen ya una aplicación que lo haga les agredeceria que ingresen la variable
HashCadena: 497EC4EFC0BD0391936A6CEC336AEE3E
y la firmen para comparar si el resultado es el mismo que yo muestro... La estoy firmando con los certificados de prueba del SAT. En particular con:

Llave privada: aaa010101aaa_FIEL.key
Contraseña: a0123456789

si no cuentan con los archivos puedo enviarlos al correo que me indiquen.

Muchas gracias y que tengan buen día,
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Dado »

Quiero corregirte algunos terminos, talvez incluso eso ayude a resolver tu problema.
.- Firmar con llave privada (*.key) es decir, firmar HashCadena (497EC4EFC0BD0391936A6CEC336AEE3E) con
SHA-1 y el resultado codificado en hexadecimal
El resultado del Sello se debe codificar en Base64 no en hex
Entiendo que estoy cifrando un texto y el tamaño de la firma dependerá del texto a firmar.
No es asi, sin importar el tamaño del texto al digerirlo con MD5 SIEMPRE te da una longitud fija, despues al sellar ese MD5 tambien el resultado es fijo
Si tienen ya una aplicación que lo haga les agredeceria que ingresen la variable
HashCadena: 497EC4EFC0BD0391936A6CEC336AEE3E
y la firmen para comparar si el resultado es el mismo que yo muestro

Llave privada: aaa010101aaa_FIEL.key
Contraseña: a0123456789
Error numero 1 de los que empiezan, NO DEBES USAR LA FIEL, debes usar los certificados DE SELLO.

Por otro lado existe la remota pero posible caso en el que se generen dos sellos distintos pero validos, no siempre es buena idea comparar los sellos "para ver si estan bien" checa esta entrada

Por ultimo, para saber si un sello es correcto agregalo a tu XML y pasalo por el validador
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
jblancas
Mensajes: 3
Registrado: Mar Dic 07, 2010 11:50 am

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por jblancas »

Firma.jpg
Firma.jpg (92.26 KiB) Visto 10500 veces
Hola Dado,

Primero que nada gracias por la atención y por tus respuestas, justo hoy me inscribí al foro y estoy leyendo mucho de lo ya expuesto, se aclaran dudas y surgen nuevas, sin embargo me esta ayudando bastante los post anteriores...

Deseo aclarar que mi pregunta va enfocada hacia la Firma Electrónica de documentos, no a la factura electrónica, aunque me parece que son temas parecidos.

En la aplicación que estoy desarrollando tengo un Web Panel donde el usuario captura una gran cantidad de información, después de la captura y algunas operaciones sobre la información se imprime un reporte pdf.

Se necesita que este reporte lleve la firma de la persona que capturo el documento, no puede ser autógrafa debido a que las personas que lo utilizan están en diferentes puntos del país, eso trae muchos problemas... la solución fue implementar la firma electrónica, así cada una de estas personas debe solicitar su FIEL al SAT (*.key, *.cer) y la FIEL será utilizada para firmar los documentos y enviarlos por correo o recuperarlos a través del sistema.

Ahora la teoria es muy sencilla...

Firmar
1.- Obtener el hash del documento
2.- El hash lo vamos a cifrar con la llave primaria (*.key)
3.- La cadena resultante de la firma será la que se imprima en el pdf.

Validar firma y saber si el documento sufrio alteraciones

1.- Obtener el hash del documento
2.- Descifrar la firma electrónica (impresa en el pdf) utilizando la llave publica (*.cer)
3.- Comparar el hash del documento obtenido en el punto 1 con el resultado del descifrado del punto 2
4.- Si coinciden ambos hash, podemos saber que el documento no sufrió alteraciones desde que se firmo.


Y bueno, las dudas son las que ya habia enunciado antes: la cadena (firma) que obtengo es un char de 250 en hexadecimal, que debido a tu recomendación cambiare a base64, la pregunta sigue siendo como valido que esa firma que genere es correcta? me parece que 250 caracteres es mucho, y me interesa saber la longitud para guardarla en mi base de datos...

Ahora bien, si el hash generado es en md5 el resultado debe ser de 32 char hexadecimal
si es sha-1 debe de ser de 40 char en hexadecimal....

si tengo una longitud constante de 40 o 32 la cadena resultante de la firma debe de ser igual constante... eso me dice el sentido comun, pero en esto de la programación muchas veces no es así...

anexo una imagen
Adjuntos
Verificacion.jpg
Verificacion.jpg (102.85 KiB) Visto 10500 veces
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Sello de 25 caracteres, esta bien asi?

Mensaje por Dado »

Longitud maxima del sello es de 172 caracteres, checa esta entrada

Para generar el sello paso a paso incluyendo ejemplos checa esta entrada

Para validar el sello checa esta entrada

Como ves, casi todas tus dudas ya estan resueltas, solo hay que BUSCAR...........

Ahora, entiendo, NO estas generando la firma digital para factura electronica, lo estas haciendo para un documento X cualquier, bueno, aqui aplica la misma situacion, lo que tienes que hacer es convertir ese PDF en base 64 y considerarlo como tu "cadena original" y todo lo demas es igual.

Ahora, porque base64? porque ese es el estandar, no firmas bytes hexadecimales, firmas cadenas de texto y para convertir un PDF a cadena de texto lo conviertes a Base64....

Ahora, hay un problema de logistica, si tienes un PDF al cual le calculas el hash y su sello significa que YA NO PUEDES "TOCARLO" ni modificarlo, de eso se trata no? que una vez firmado ya no lo alteren y si lo modifican entonces sea posible detectarlo. Bueno, con eso en mente, entonces ya NO PUEDES AGREGARLE NI QUITARLE NADA, eso incluye la firma que quieres "que aparezca en el PDF impreso"....ya no puedes agregarla porque echarias a perder la firma
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
Cerrado