Problème : OpenSSL ne fonctionne pas dans mon environnement Windows.
Environnement :
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
Ce que j'ai tenté :
- Instructions d'installation 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
- Redémarrage de
-
phpinfo :
----Support OpenSSL activé
----OpenSSL Version de la bibliothèque OpenSSL 1.0.1e 11 févr. 2013
----OpenSSL Header Version OpenSSL 0.9.8y 5 Feb 2013 - Avec et sans spécification config en
configargs
- Avec et sans spécification
<Directory E:\wamp\php\extras>
dans la configuration d'apache - Copié
openssl.cnf
vers le virtualhost public_html, j'ai pointé vers celui-ci et j'ai toujours les mêmes erreurs. - Rien n'est connecté journal des erreurs
- Recherché : J'ai passé les deux derniers jours à faire des recherches sur ce sujet. Je suis surpris qu'il n'y ait pas plus d'informations à ce sujet et je les publie ici. Il semble qu'il y ait un problème avec la configuration d'OpenSSL ou qu'Apache/php ne lise pas correctement la configuration.
Code :
$privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
echo $message.'<br />'.PHP_EOL;
}
Résultats :
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 manuellement :
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:
- Grâce à @Gordon je peux maintenant voir les erreurs open_ssl en utilisant
openssl_error_string
- Désinstaller complètement EasyPHP. Installation manuelle des versions stables de PHP/Apache. Même résultat ! Il y a certainement quelque chose que je fais mal en implémentant openssl sous Windows.
- Section OpenSSL Manually... informations supplémentaires sur les erreurs
DERNIÈRES RÉFLEXIONS :
J'ai installé une boîte linux et j'obtiens les mêmes erreurs. Après avoir joué un peu, je vois que même s'il y a des erreurs à openssl_pkey_new, il finit par créer mon fichier p12 de test. Pour faire court, les erreurs sont trompeuses et il s'agit plutôt de comment vous utilisez les fonctions d'openssl, pas tellement la configuration côté serveur.
Code 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");
Tout près.
Un an plus tard...
Je me suis donc retrouvé à le faire à nouveau un an plus tard, et quelles que soient les variables PATH que je définissais sur l'ordinateur ou pendant l'exécution du script, il continuait à émettre une erreur à propos d'un fichier non trouvé. J'ai pu résoudre ce problème en passant dans le fichier config
dans les config_args
dans openssl_pkey_new
. Voici une fonction qui teste la capacité à utiliser OpenSSL avec succès :
/**
* 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>";
}