php_openssl php7 instalar extension php apache apache2 openssl easyphp

php7 - OpenSSL no funciona en Windows, errores 0x02001003 0x2006D080 0x0E064002



php7 openssl (8)

¿Has instalado OpenSSL a través de este método? Instalando OpenSSL en Windows

  1. Vaya a http://gnuwin32.sourceforge.net/packages/openssl.htm y descargue la versión "Configuración" de "Binarios", openssl-0.9.7c-bin.exe.

  2. Haga doble clic en openssl-0.9.7c-bin.exe para instalar OpenSSL en el directorio / local / gnuwin32.

  3. Regrese a la misma página, descargue la versión "Configuración" de "Documentación" e instálela en el mismo directorio.

  4. Abra la ventana de línea de comando y pruebe el siguiente comando: Código:

/local/gnuwin32/bin/openssl -help openssl:Error: ''-help'' is an invalid command. Standard commands asn1parse ca ciphers crl crl2pkcs7 dgst dh dhparam dsa dsaparam enc engine errstr gendh gendsa genrsa nseq ocsp passwd pkcs12 pkcs7 pkcs8 rand req rsa rsautl s_client s_server s_time sess_id smime speed spkac verify version x509 ......

Si ve la lista de comandos impresos por OpenSSL, sabrá que su instalación se realizó correctamente.

Problema: OpenSSL no funciona en mi entorno de Windows. OpenSSL informa repetidamente los errores 0x02001003, 0x2006D080 y 0x0E064002.

Ambiente:

Windows NT x 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586 Apache/2.4.4 (Win32) PHP/5.4.13 x86 PHP Directory: E:/wamp/php/ Virtual Host Directory: E:/Projects/1/public_html

Lo que he intentado:

  • Instrucciones de instalación http://www.php.net/manual/en/openssl.installation.php
  • extension=php_openssl.dll
  • Openssl.cnf E:/wamp/php/extras/openssl.cnf
  • % PATH% E:/wamp/php
  • Reiniciado
  • phpinfo:
    ---- Soporte OpenSSL habilitado
    ---- OpenSSL Library Version OpenSSL 1.0.1e 11 Feb 2013
    ---- OpenSSL Header Version OpenSSL 0.9.8y 5 Feb 2013
  • Con y sin especificar config en configargs
  • Con y sin especificar <Directory E:/wamp/php/extras> en la configuración de apache
  • Se openssl.cnf en virtualhost public_html, se señaló eso y aún se obtienen los mismos errores
  • Nada ha iniciado sesión error_log
  • Investigado: He pasado los últimos 2 días investigando esto, sorprendido de que no haya más información sobre él, así que estoy publicando aquí. Parece ser un problema con la configuración de OpenSSL o apache / php no está leyendo la configuración correctamente.

Código:

$privateKey = openssl_pkey_new(); while($message = openssl_error_string()){ echo $message.''<br />''.PHP_EOL; }

Resultados:

error:02001003:system library:fopen:No such process error:2006D080:BIO routines:BIO_new_file:no such file error:0E064002:configuration file routines:CONF_load:system lib error:02001003:system library:fopen:No such process error:2006D080:BIO routines:BIO_new_file:no such file error:0E064002:configuration file routines:CONF_load:system lib

OpenSSL Manualmente:

E:/wamp/apache/bin>openssl.exe pkey WARNING: can''t open config file: c:/openssl-1.0.1e/ssl/openssl.cnf E:/wamp/apache/bin>set OPENSSL_CONF="E:/wamp/php/extras/openssl.cnf" E:/wamp/apache/bin>openssl.exe pkey 3484:error:0200107B:system library:fopen:Unknown error:./crypto/bio/bss_file.c:169:fopen(''"E:/wamp/php/extras/openssl.cnf"'',''rb'') 3484:error:2006D002:BIO routines:BIO_new_file:system lib:./crypto/bio/bss_file.c:174: 3484:error:0E078002:configuration file routines:DEF_LOAD:system lib:./crypto/conf/conf_def.c:199:

EDITAR:

  1. Gracias a @Gordon ahora puedo ver errores open_ssl usando openssl_error_string
  2. Desinstalar por completo EasyPHP. Instalado manualmente versiones estables de PHP / Apache. ¡Mismos resultados! Definitivamente algo que estoy haciendo mal con la implementación de openssl en Windows.
  3. Sección manual de OpenSSL ... información de error adicional

PENSAMIENTOS FINALES:
Configuré un cuadro de Linux y recibo los mismos errores. Después de algunos juegos, veo que a pesar de que está arrojando errores en el openssl_pkey_new, finalmente crea mi archivo de prueba p12. Para abreviar, los errores son engañosos y tiene que ver más con cómo está utilizando las funciones de openssl, no tanto con la configuración del lado del servidor.

Código final:

// Create the keypair $res=openssl_pkey_new(); // Get private key openssl_pkey_export($res, $privkey); // Get public key $pubkey=openssl_pkey_get_details($res); $pubkey=$pubkey["key"]; // Actual file $Private_Key = null; $Unsigned_Cert = openssl_csr_new($Info,$Private_Key,$Configs); $Signed_Cert = openssl_csr_sign($Unsigned_Cert,null,$Private_Key,365,$Configs); openssl_pkcs12_export_to_file($Signed_Cert,"test.p12",$Private_Key,"123456");

Cerca.

Un año después...

Así que me encontré haciendo esto de nuevo un año después, y sin importar las variables de PATH que configuré en la computadora o durante la ejecución de la secuencia de comandos, seguí cometiendo un error sobre el archivo no encontrado. Pude resolverlo pasando el parámetro config en la matriz config_args en openssl_pkey_new . Aquí hay una función que prueba la capacidad de usar con éxito OpenSSL:

/** * Tests the ability to 1) create pub/priv key pair 2) extract pub/priv keys 3) encrypt plaintext using keys 4) decrypt using keys * * @return boolean|string False if fails, string if success */ function testOpenSSL($opensslConfigPath = NULL) { if ($opensslConfigPath == NULL) { $opensslConfigPath = "E:/Services/Apache/httpd-2.4.9-win32-VC11/conf/openssl.cnf"; } $config = array( "config" => $opensslConfigPath, "digest_alg" => "sha512", "private_key_bits" => 4096, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); $res = openssl_pkey_new($config); // <-- CONFIG ARRAY if (empty($res)) {return false;} // Extract the private key from $res to $privKey openssl_pkey_export($res, $privKey, NULL, $config); // <-- CONFIG ARRAY // Extract the public key from $res to $pubKey $pubKey = openssl_pkey_get_details($res); if ($pubKey === FALSE){return false;} $pubKey = $pubKey["key"]; $data = ''plaintext data goes here''; // Encrypt the data to $encrypted using the public key $res = openssl_public_encrypt($data, $encrypted, $pubKey); if ($res === FALSE){return false;} // Decrypt the data using the private key and store the results in $decrypted $res = openssl_private_decrypt($encrypted, $decrypted, $privKey); if ($res === FALSE){return false;} return $decrypted; } // Example usage: $res = testOpenSSL(); if ($res === FALSE) { echo "<span style=''background-color: red;''>Fail</span>"; } else { echo "<span style=''background-color: green;''>Pass: ".$res."</span>"; }


El siguiente código funciona como se esperaba. PERO si ejecuta openssl_error_string() después de los métodos openssl, muestra el error:0E06D06C:configuration file routines:NCONF_get_string:no value que sea un aviso que no haya podido encontrar en la documentación.

Además, tenga en cuenta que, de acuerdo con http://www.php.net/manual/en/function.openssl-error-string.php , podría estar viendo errores erróneos a medida que los mensajes de error se ponen en cola:

Tenga cuidado al usar esta función para verificar errores, ya que parece leer de un búfer de> errores, que podría incluir errores de otro script o proceso que estaba usando las funciones de openssl. (Me sorprendió encontrar que returing los mensajes de error antes de llamar a las funciones> openssl_ *)

<?php /* Create the private and public key */ $res = openssl_pkey_new(); openssl_error_string(); // May throw error even though its working fine! /* Extract the private key from $res to $privKey */ openssl_pkey_export($res, $privKey); openssl_error_string(); // May throw error even though its working fine! /* Extract the public key from $res to $pubKey */ $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; $data = ''i.amniels.com is a great website!''; /* Encrypt the data using the public key * The encrypted data is stored in $encrypted */ openssl_public_encrypt($data, $encrypted, $pubKey); /* Decrypt the data using the private key and store the * result in $decrypted. */ openssl_private_decrypt($encrypted, $decrypted, $privKey); echo $decrypted; ?>


En mi caso, copiar los archivos a c: / windows / system32 me ayudó

libeay32.dll, ssleay32.dll

Uno puede encontrarlos en OpenSSL_INSTALL_PATH / bin.


Podría sugerir el uso de Virtual Box , crear una VM e instalar la pila LAMP. Esto te dará un ambiente "más real". Además de la resolución de problemas, OpenSSL es más fácil en Linux.

Dicho esto, creo que su problema es que no puede encontrar el archivo de complemento en sí. Asegúrese de que esté en el camino correcto y que exista en su máquina y que el proceso por el que Apache se ejecuta tenga permisos para leerlo.


Si está utilizando Apache 2.4 + mod_fcgid, puede especificar el archivo de FcgidInitialEnv OpenSSL agregando FcgidInitialEnv en el archivo httpd.conf:

# OPENSSL CONF FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"

No estoy usando un paquete preconfigurado como WAMP, tengo Apache de Apache Lounge y PHP de windows.php.net y lo configuré yo mismo.


Tuve un problema similar, para mí ayudó a configurar manualmente la variable de entorno ''OPENSSL_CONF'' al comienzo de mi script.

De alguna manera, la variable de entorno no se configuró correctamente o no llegó a mi php (Configuración: AMPPS, Win7 64Bit).

La ubicación de ejemplo que se utiliza a continuación es la ruta que debe usar con una instalación AMPPS estándar, por lo que si está utilizando AMPPS, solo copie y pegue:

putenv("OPENSSL_CONF=C:/Program Files (x86)/Ampps/php/extras/openssl.cnf");


algunas cosas aquí:

%PATH% también debe contener Windows y System32, por lo que%% PATH% debe verse como c:/windows;c:/windows/system32;E:/wamp/php y en e:/wamp/php debe ser el archivo dll de openssl

también pruebe la versión de openssl que coincida con la versión de encabezado 0.9.8y 5 Feb 2013 descargue aquí para 32 bits y aquí para 64 bits

este código parece funcionar para mí:

// Create the keypair $res=openssl_pkey_new(); // Get private key openssl_pkey_export($res, $privkey); // Get public key $pubkey=openssl_pkey_get_details($res); $pubkey=$pubkey["key"]; $Info = array( "countryName" => "UK", "stateOrProvinceName" => "Somerset", "localityName" => "Glastonbury", "organizationName" => "The Brain Room Limited", "organizationalUnitName" => "PHP Documentation Team", "commonName" => "Wez Furlong", "emailAddress" => "[email protected]" ); // Actual file $Private_Key = null; $Unsigned_Cert = openssl_csr_new($Info,$Private_Key); $Signed_Cert = openssl_csr_sign($Unsigned_Cert,null,$Private_Key,365); openssl_pkcs12_export_to_file($Signed_Cert,"test.p12",$Private_Key,"123456");


Solución limpia:

  1. Descargue el archivo (no importa cuál) para los binarios de PHP Windows desde aquí: http://windows.php.net/download
  2. Dentro encontrará el archivo /extras/ssl/openssl.cnf
  3. Extraiga openssl.cnf en algún lugar (por ejemplo, "C: /WEB/PHP/extras/ssl/openssl.cnf")
  4. Agregue la variable del sistema global OPENSSL_CONF con su ruta utilizada (por ejemplo, "C: / WEB / PHP / extras / openssl.cnf" (sin las comillas dobles)).

Debe agregar la ruta a la variable de sistema OPENSSL_CONF . ¡Agregarlo a la variable del sistema Path no es suficiente! En Windows 7, encontrará el cuadro de diálogo de configuración en "Panel de control> Sistema y seguridad> Sistema> Configuración avanzada del sistema (menú de la izquierda)> Avanzado (pestaña)> Variables de entorno ...". Agregue la variable OPENSSL_CONF allí.

No es necesario preparar el archivo openssl.cnf antes del uso; funcionará de la caja. Pero puedes, si quieres ajustar la configuración.