50 votes

OpenSSL ne fonctionne pas sous Windows

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:

  1. Grâce à @Gordon je peux maintenant voir les erreurs open_ssl en utilisant openssl_error_string
  2. 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.
  3. 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>";
    }

9voto

Brock Hensley Points 1720

Le code ci-dessous fonctionne comme prévu. MAIS si vous exécutez openssl_error_string() après les méthodes openssl il montre error:0E06D06C:configuration file routines:NCONF_get_string:no value qui est un avis sur lequel je n'ai pas pu trouver de documentation.

Il convient également de noter que, selon http://www.php.net/manual/en/function.openssl-error-string.php vous pourriez voir des erreurs erronées car 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 à partir d'un tampon d'erreurs >, qui pourrait inclure des erreurs provenant d'un autre script ou d'un processus qui utilisait des fonctions openssl >. (J'ai été surpris de constater qu'elle renvoyait des messages d'erreur avant que j'aie appelé une quelconque > fonction 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;
?>

4voto

borrel Points 578

Quelques éléments ici :

%PATH% devrait également contenir Windows et system32, de sorte que votre %PATH% devrait ressembler à ceci c:\windows;c:\windows\system32;E:\wamp\php et en e:\wamp\php Ce doit être le fichier dll d'openssl.

Essayez également de faire correspondre la version d'openssl à celle de l'en-tête. 0.9.8y 5 Feb 2013 télécharger ici pour 32bit y ici pour 64bit

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" => "wez@example.com"
);

// 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");

4voto

Larzan Points 503

J'ai eu un problème similaire. Pour moi, il a été utile de 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 (Configuration : AMPPS, Win7 64Bit).

L'exemple d'emplacement utilisé ci-dessous est le chemin que vous auriez à utiliser avec une installation standard d'AMPPS, donc si vous utilisez AMPPS, il suffit de copier/coller :

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

1voto

Dwij Points 11

Avez-vous installé OpenSSL par cette méthode ? Installation d'OpenSSL sous Windows

  1. Aller à http://gnuwin32.sourceforge.net/packages/openssl.htm et téléchargez la version "Setup" de "Binaries", openssl-0.9.7c-bin.exe.

  2. Double-cliquez sur openssl-0.9.7c-bin.exe pour installer OpenSSL sur votre ordinateur. \local\gnuwin32 répertoire.

  3. Retournez sur la même page, téléchargez la version "Setup" de "Documentation", et installez-la dans le même répertoire.

  4. Ouvrez une 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ée par OpenSSL, vous savez que votre installation est faite correctement.

0voto

Stefan Michev Points 131

Dans mon cas, je copie les fichiers dans le répertoire c : \windows\system32 m'a aidé

libeay32.dll, ssleay32.dll

On peut les trouver dans OpenSSL_INSTALL_PATH \bin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X