Problème: OpenSSL ne fonctionne pas dans mon environnement Windows. OpenSSL signale à plusieurs reprises les erreurs 0x02001003, 0x2006D080 et 0x0E064002.
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 essayé:
extension=php_openssl.dll
E:\wamp\php\extras\openssl.cnf
E:\wamp\php
configargs
<Directory E:\wamp\php\extras>
dans Apache configopenssl.cnf
copié vers virtualhost public_html, pointez vers cela et obtenez toujours les mêmes erreursCode:
$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:
MODIFIER:
openssl_error_string
DERNIÈRES PENSÉES:
J'ai installé une boîte Linux et je reçois les mêmes erreurs. Après quelques essais, je constate que même s’il génère des erreurs lors de l’openssl_pkey_new, il finit par créer mon fichier de test p12. En résumé, les erreurs sont trompeuses et il faut traiter davantage de comment vous utilisez les fonctions 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");
Fermer.
Un an plus tard...
Je me suis donc retrouvé dans cette situation 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, l'erreur sur le fichier non trouvé persistait. J'ai pu le résoudre en passant le paramètre config
dans le tableau config_args
dans openssl_pkey_new
. Voici une fonction qui teste la capacité d'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>";
}
Le code ci-dessous fonctionne comme prévu. MAIS si vous exécutez openssl_error_string()
après les méthodes openssl, il affiche error:0E06D06C:configuration file routines:NCONF_get_string:no value
, ce qui est un avertissement pour lequel je n’ai pas pu trouver de documentation.
Veuillez également noter que, selon http://www.php.net/manual/en/function.openssl-error-string.php , il est possible que vous voyiez des erreurs d’alignement lorsque les messages d’erreur sont mis en file d'attente:
Soyez prudent lorsque vous utilisez cette fonction pour vérifier les erreurs, car elle semble lire dans un tampon d'erreurs, ce qui peut inclure des erreurs provenant d'un autre script ou processus utilisant des fonctions openssl>. (J'ai été surpris de le retrouver en retenant les messages d'erreur avant d'appeler des fonctions> 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;
?>
J'ai eu un problème similaire, cela m'a aidé à définir la variable d'environnement 'OPENSSL_CONF' manuellement au début de mon script.
D'une manière ou d'une autre, la variable d'environnement n'a pas été définie correctement ou n'a pas été transmise à mon php (Setup: AMPPS, Win7 64Bit).
L'exemple d'emplacement utilisé ci-dessous est le chemin que vous devez utiliser avec une installation AMPPS standard. Par conséquent, si vous utilisez AMPPS, il suffit de copier-coller:
putenv("OPENSSL_CONF=C:\Program Files (x86)\Ampps\php\extras\openssl.cnf");
quelques choses ici:
%PATH%
doit également contenir windows et system32 afin que votre% PATH% ressemble à c:\windows;c:\windows\system32;E:\wamp\php
et que e:\wamp\php
soit le fichier dll openssl
essayez également la version openssl correspondant à la version d’en-tête 0.9.8y 5 Feb 2013
télécharger ici pour 32 bits et ici pour 64 bits
ce code semble fonctionner pour moi:
// 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");
Avez-vous installé OpenSSL avec cette méthode? Installer OpenSSL sous Windows
Allez sur http://gnuwin32.sourceforge.net/packages/openssl.htm et téléchargez la version "Setup" de "Binaries", openssl-0.9.7c-bin.exe.
Double-cliquez sur openssl-0.9.7c-bin.exe pour installer OpenSSL dans le répertoire\local\gnuwin32.
Retournez à la même page, téléchargez la version "Installation" de "Documentation" et installez-la dans le même répertoire.
Ouvrez la fenêtre de ligne de commande et essayez la commande suivante: Code:
\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 vous voyez la liste des commandes imprimées par OpenSSL, vous savez que votre installation est correctement effectuée.
Si vous utilisez Apache 2.4 + mod_fcgid, vous pouvez spécifier le fichier de configuration OpenSSL en ajoutant FcgidInitialEnv
au fichier httpd.conf:
# OPENSSL CONF
FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf"
Je n'utilise pas de paquet préconfiguré tel que WAMP, j'ai Apache de Apache Lounge et PHP de windows.php.net et est configuré par moi-même.
Solution propre:
OPENSSL_CONF
avec le chemin utilisé (par exemple, "C:\WEB\PHP\extras\openssl.cnf" (sans les guillemets)).Vous devez ajouter le chemin d'accès à la variable système OPENSSL_CONF
. L'ajouter à la variable système Path
n'est pas suffisant! Sous Windows 7, vous trouverez la boîte de dialogue de configuration sous: "Panneau de configuration> Système et sécurité> Système> Paramètres système avancés (menu de gauche)> Avancés (Onglet)> Variables d'environnement ...". Ajoutez la variable OPENSSL_CONF
ici.
Il n'est pas nécessaire de préparer le fichier openssl.cnf avant de l'utiliser - cela fonctionnera immédiatement. Mais vous pouvez, si vous voulez affiner les paramètres.
Dans mon cas, copier les fichiers sur c:\windows\system32 m'a aidé
libeay32.dll, ssleay32.dll
On peut les trouver dans OpenSSL_INSTALL_PATH\bin.