web-dev-qa-db-fra.com

OpenSSL ne fonctionne pas sous Windows, erreurs 0x02001003 0x2006D080 0x0E064002

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é:

  • Instructions d'installationhttp://www.php.net/manual/fr/openssl.installation.php
  • PHP.iniextension=php_openssl.dll
  • Openssl.cnfE:\wamp\php\extras\openssl.cnf
  • % PATH%E:\wamp\php
  • Redémarré
  • phpinfo:
    ---- Support OpenSSL activé
    ---- Version de la bibliothèque OpenSSL OpenSSL 1.0.1e 11 février 2013
    ---- OpenSSL Header Version OpenSSL 0.9.8y 5 février 2013 
  • Avec et sans spécifier config dans configargs
  • Avec et sans spécifier <Directory E:\wamp\php\extras> dans Apache config
  • openssl.cnf copié vers virtualhost public_html, pointez vers cela et obtenez toujours les mêmes erreurs
  • Aucune connexion dans error_log
  • Recherche: J'ai passé les deux derniers jours à faire des recherches à ce sujet, surpris qu'il n'y ait pas plus d'informations à ce sujet, alors je poste ici. Cela semble être un problème avec OpenSSL config ou Apache/php ne lisant pas config correctement.

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:

MODIFIER:

  1. Grâce à @Gordon, je peux maintenant voir les erreurs open_ssl en utilisant openssl_error_string
  2. Désinstaller complètement EasyPHP. Versions stables installées manuellement de PHP/Apache. Même résultat! Certainement quelque chose que je fais mal avec la mise en œuvre de openssl sur Windows.
  3. Section OpenSSL Manually ... informations d'erreur supplémentaires

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>";
    }
48
Brock Hensley

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;
?>
7
Brock Hensley

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");
4
Larzan

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");
4
borrel

Avez-vous installé OpenSSL avec cette méthode? Installer OpenSSL sous Windows 

  1. Allez sur 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 dans le répertoire\local\gnuwin32. 

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

  4. 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.

1
Dwij

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.

1
Stritof

Solution propre:

  1. Télécharger l'archive (peu importe) pour les binaires PHP Windows à partir d'ici: http://windows.php.net/download
  2. A l'intérieur, vous trouverez le fichier /extras/ssl/openssl.cnf
  3. Extrayez openssl.cnf quelque part (par exemple, "C: /WEB/PHP/extras/ssl/openssl.cnf")
  4. Ajoutez la variable système globale OPENSSL_CONF avec le chemin utilisé (par exemple, "C:\WEB\PHP\extras\openssl.cnf" (sans les guillemets)).

 enter image description here

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.

1
StanE

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.

0
Stefan Michev