Problem: OpenSSL does not work in my Windows environment. OpenSSL repeatedly reports errors 0x02001003, 0x2006D080 and 0x0E064002.
Environment:
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
What I tried:
- Installation Instructions http://www.php.net/manual/en/openssl.installation.php
- PHP.ini
extension=php_openssl.dll - Openssl.cnf
E:\wamp\php\extras\openssl.cnf - % PATH%
E:\wamp\php - reboots
- phpinfo:
---- OpenSSL support included
---- OpenSSL Library Version OpenSSL 1.0.1e Feb 11, 2013
---- OpenSSL OpenSSL Header Version 0.9.8y February 5, 2013 - With and without config in
configargs - With and without
<Directory E:\wamp\php\extras> in the apache configuration - Copied
openssl.cnf in virtualhost public_html, pointed this out and still getting the same errors - Nothing logged error_log
- Researched: I spent the last 2 days researching this, surprised that there is no more information on it, so I am posting here. The problem seems to be related to the OpenSSL or apache / php configuration, which reads the configuration incorrectly.
The code:
$privateKey = openssl_pkey_new(); while($message = openssl_error_string()){ echo $message.'<br />'.PHP_EOL; }
Results:
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 Manually:
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:
EDIT:
- Thanks to @Gordon, I can now see open_ssl errors with
openssl_error_string - Completely remove EasyPHP. Manually installed stable versions of PHP / Apache. The same results! Definitely something I am doing wrong with the implementation of openssl in windows.
- OpenSSL Manual section ... more error information
FINAL THOUGHTS:
I installed linux box and I get the same errors. After some games, I see that although it throws errors in openssl_pkey_new, it eventually creates my test file p12. In short, errors are misleading, and he has to deal more with how you use openssl functions, not much server-side configuration.
End Code:
// 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");
To close.
In a year...
Thus, I found myself doing it again a year later, and regardless of any PATH variables that I set on the computer or during the execution of the script, it did not detect an error in the file. I was able to resolve it by passing the config parameter in the config_args array to openssl_pkey_new . Here is a function that tests the possibility of using OpenSSL successfully:
/** * 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>"; }