CRLibre / API_Hacienda

API libre para Factura Electrónica en Costa Rica, interfaz para integrar sistemas con el Ministerio de Hacienda para la Facturación Electrónica
https://crlibre.org/factura-electronica/
GNU Affero General Public License v3.0
166 stars 122 forks source link

Error al firmar: no se puede leer el almacén de certificados o la clave no es la correcta #168

Open AbrahamUdevs opened 2 months ago

AbrahamUdevs commented 2 months ago

Saludos.

Describa el problema (bug) El problema consiste en que la API es incapaz de firmar el xml que envío (Ocurre tanto a la hora de hacer la petición dentro del sistema como a la hora de hacerla a través de POSTMAN). Siempre que intento hacer una petición a la API con cualquiera de los métodos, el sistema retorna "Error: No se puede leer el almacén de certificados o la clave no es la correcta", a pesar de que yo incluyo todos los parámetros solicitados en la documentación.

Pasos para reproducir Realizar llamados normales a la API según la documentación (Puede ser desde el sistema o POSTMAN)

Versión API: 3f0855f9

Sistema operativo: Windows

PHP versión: 8.3.10

MySQL versión: 10.4.32-MariaDB

Comportamiento esperado 68747470733a2f2f707265766965772e6962622e636f2f674659376b642f32372e706e67-1

Capturas de pantalla o registro de bitácora El error ocurre en: imagen Donde con openssl_error_string() se obtiene el error: "error:0308010C:digital envelope routines::unsupported"

Contexto adicional Según parecer ser, las llaves privadas generadas por Hacienda tienen propiedades de encriptación que están obsoletas hoy en día, y muchas de las herramientas de extracción de llaves y certificados no ofrecen soporte. Entre ellas, parece estar Openssl, porque inclusive, cuando intento extraer su certificado usando Openssl desde la terminal, esta retorna el error:

"Error outputting keys and certificates 74450000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto\evp\evp_fetch.c:355:Global default library context, Algorithm (RC2-40-CBC : 0), Properties ()"

Openssl versión: 3.3.1 4

El sistema ha sido instalado en un servidor Artisan usado por una aplicación de Laravel

Hay una solución rondando por ahí que dice que debo activar el Legacy Provider en el openssl.cnf, pero esta ya me ha dejado claro que no es efectiva.

Muchas gracias.

fdelapena commented 2 months ago

Hola, en Windows lo que puede suceder es que en openssl-modules falte legacy.dll. Ver esta nota para más información:

https://github.com/php/php-src/issues/9890#issuecomment-1303855417

Agradecería si pudiera confirmar si la solución propuesta le funciona en su caso. No olvide definir o redefinir OPENSSL_MODULES como variable de entorno.

Como referencia para lo que menciona del openssl.cnf que puede servir a más personas como complemento a este ticket: https://github.com/php/php-src/issues/12369#issuecomment-1756473904 Además de este comentario en la documentación: https://www.php.net/manual/es/function.openssl-pkcs12-read.php#128941

fdelapena commented 2 months ago

Con respecto a su mención sobre el uso de OpenSSL por línea de comandos, a partir de la versión 3, si desde consola quiere extraerlo debe agregar el parámetro -legacy para extraerlo de manera manual, creo que independientemente de si modificó el .cnf o no. Vea la nota https://www.php.net/manual/es/function.openssl-pkcs12-read.php#128992 para un ejemplo de conversión.

AbrahamUdevs commented 2 months ago

¡SOLUCIONADO! Muchas gracias, tuve que tener hacer un par de revisiones porque hice mal el procedimiento. Pero terminó funcionando. Muchas gracias, otra vez.

TonyQuiros1099 commented 2 months ago

Como resolviste el problema ? me esta sucediendo lo mismo gracias