OpenSSL não está funcionando no Windows, erros 0x02001003 0x2006D080 0x0E064002

Problema: O OpenSSL não está funcionando no meu ambiente Windows. O OpenSSL relata repetidamente os erros 0x02001003, 0x2006D080 e 0x0E064002.

Meio Ambiente:

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

O que eu tentei:

instruções de instalação http://www.php.net/manual/en/openssl.installation.phpPHP.ini extension=php_openssl.dllOpenssl.cnf E:\wamp\php\extras\openssl.cnf%CAMINHO% E:\wamp\phpReinicializadophpinfo:
---- Suporte a OpenSSL ativado
---- OpenSSL Library Version OpenSSL 1.0.1e 11 de fevereiro de 2013
---- OpenSSL Header Version OpenSSL 0.9.8a 5 de fevereiro de 2013Com e sem especificarconfig emconfigargsCom e sem especificar<Directory E:\wamp\php\extras> na configuração do apacheCopiadoopenssl.cnf para virtualhost public_html, apontou para isso e ainda obter os mesmos errosNada logadoerror_logPesquisado: Eu passei os últimos 2 dias pesquisando isso, surpreso, não há mais informações sobre isso, então estou postando aqui. Parece ser um problema com o OpenSSL config ou o apache / php não está lendo a configuração corretamente.

Código:

$privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
    echo $message.'<br />'.PHP_EOL;
}

Resultados:

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

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:

Graças a @Gordon agora posso ver erros open_ssl usandoopenssl_error_stringDesinstale completamente o EasyPHP. Versões estáveis ​​manualmente instaladas do PHP / Apache. Mesmos resultados! Definitivamente algo que estou fazendo de errado com a implementação do openssl no windows.Seção Manuais do OpenSSL ... informações adicionais sobre erros

PENSAMENTOS FINAIS:
Eu configurei uma caixa linux e estou recebendo os mesmos erros. Depois de algumas brincadeiras, vejo que, mesmo que esteja lançando erros no arquivo openssl_pkey_new, ele eventualmente cria meu arquivo p12 de teste. Longa história curta, os erros são enganosos e tem que lidar mais comcomo você está usando funções openssl não muito configuração do lado do servidor.

Código 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");

De perto.

Um ano depois...

Então eu me vi fazendo isso novamente um ano depois, e independentemente de quaisquer variáveis ​​PATH que eu configurei no computador ou durante a execução do script, ele ficava errando sobre o arquivo não encontrado. Consegui resolvê-lo passando oconfig parâmetro noconfig_args array emopenssl_pkey_new. Aqui está uma função que testa a capacidade de usar com sucesso o OpenSSL:

    /**
     * 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>";
    }

questionAnswers(8)

yourAnswerToTheQuestion