jueves, 18 de octubre de 2012

PHP has encountered an Access Violation at 00000000 openssl

Un amigo después de tener trabajando en un servidor una aplicación con manejo de openssl y php (para facturas electrónicas), el equipo falló entonces tuvo que mudarlo a otro servidor el cuál ya tenía instalado PHP pero al pasarlo al otro servidor nos topamos con el siguiente error:

- PHP has encountered an Access Violation at 00000000 -

Después de que estuvo revisando nos encontramos que el error se producía cuando trataba de ejecutar el comando openssl_sign() a pesar de que al correr un phpinfo parecía que todo estaba configurado correctamente (ya se imaginarán nuestra frustración sin poder generar facturas).

Tuvimos que hacer varias cosas para poder resolver este problema (quizá alla otras mejores pero esta fue la que nos funciono):

1 - Instalación del OpenSSL

La instalación del OpenSSL, no estaba funcionando, por lo que tuvimos que desinstalar por completo la aplicación y reinstalarla, en este sitio http://slproweb.com/products/Win32OpenSSL.html se puede descargar la versión que utilizamos fue la Win32 OpenSSL v0.9.8x.

2 - Hacer utilizando el comando directamente

Intentamos nuevamente utilizando el comando openssl_sign() pero siguió fallando, entonces cambiamos de utilizarlo de esa forma y mejor llamar directamente al comando utilizando shell_exec() pero el problema es que al ejecutar la instruccion openssl dgst ... etc., no pasaba absolutamente nada, no marcaba error ni tampoco existía alguna entrada en el log.

El problema eran dos cosas:
a) El comando que se debe utilizar para los ejecutables para tener un poco de control en el proceso es popen() aquí algo de info del comando:  http://php.net/manual/es/function.popen.php .

La forma en que lo utilizamos fue:
------- error_reporting(E_ALL); $gestor = popen($ComandoOpenSSL.' 2>&1', 'r'); //Estos comandos son para depurar solamente // $leer = fread($gestor, 2096); // echo " --> contenido: $leer "; pclose($gestor); -----


b) Los permisos de usuario el shell_exec y el popen no funcionaban o no hacían nada debido a los permisos de usuario, la aplicación esta montada sobre un IIS por lo que era necesario darle permisos al usuario de invitado de internet, es decir al clásico IUSR_NOMBREEQUIPO para esto encontramos este sitio: http://www.somacon.com/p255.php.

Básicamente se trata que al archivo si al cmd.exe y al directorio c:\OpenSSL se le den permisos de lectura y ejecución al usuario IUSR_NOMBREEQUIPO es posible dependiendo de lo que haga su aplicación si requieren en uno u otro darle permiso de escritura.


Una vez realizado lo anterior por fin logramos reactivar el servicio :)


Espero te sea de utilidad.

Otras Referencias:
http://www.madboa.com/geek/openssl/
http://www.openssl.org/
http://www.php.net/manual/es/openssl.requirements.php
http://actron.wordpress.com/2010/11/16/facturacion-electronica-sello-openssl-php/
http://actron.wordpress.com/2010/11/18/facturacion-electronica-sello-php-y-openssl-mas-rapido/


No hay comentarios:

Publicar un comentario