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

Problema: OpenSSL não está funcionando no meu ambiente Windows. O OpenSSL relata repetidamente 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.php
  • PHP.ini extension=php_openssl.dll
  • Openssl.cnf E:\wamp\php\extras\openssl.cnf
  • % PATH% E:\wamp\php
  • Reiniciado
  • phpinfo:
    —- Suporte OpenSSL habilitado
    —- OpenSSL Library Versão OpenSSL 1.0.1e 11 fev 2013
    —- OpenSSL Header Versão OpenSSL 0.9.8y 5 Feb 2013
  • Com e sem especificar configuração em configargs
  • Com e sem especificar na configuração do apache
  • Copiou openssl.cnf para virtualhost public_html, apontou para isso e ainda obtém os mesmos erros
  • Nada foi registrado no error_log
  • Pesquisado: passei os últimos 2 dias investigando isso, surpreso, não há mais informações sobre isso, então estou postando aqui. Parece haver um problema com OpenSSL config ou apache / php não está lendo config corretamente.

Código:

 $privateKey = openssl_pkey_new(); while($message = openssl_error_string()){ echo $message.'
'.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:

  1. Graças a @Gordon agora posso ver erros do openssl_error_string usando openssl_error_string
  2. Desinstale completamente o EasyPHP. Versões estáveis ​​instaladas manualmente do PHP / Apache. Os mesmos resultados! Definitivamente, estou fazendo algo errado ao implementar o openssl no Windows.
  3. OpenSSL seção manual … informações adicionais de erro

PENSAMENTOS FINAIS:
Eu configurei uma checkbox do linux e eu estou recebendo os mesmos erros. Depois de brincar, vejo que, apesar de estar jogando erros no openssl_pkey_new, ele finalmente cria meu arquivo de teste p12. Longa história, os erros são enganosos e tem que lidar mais com a forma como você está usando as funções do openssl, não tanto a 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"); 

Feche de distância.

Um ano depois…

Então eu encontrei-me fazendo isso novamente um ano depois, e independentemente de quaisquer variables ​​PATH que eu estabeleci no computador ou durante a execução do script, ele continuou com erro sobre o arquivo não encontrado. Eu consegui resolver isso passando no parâmetro config na matriz openssl_pkey_new em openssl_pkey_new . Aqui está uma function 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 "Fail"; } else { echo "Pass: ".$res.""; } 

O código abaixo funciona como esperado. MAS, se você executar openssl_error_string() após os methods openssl, ele mostra o error:0E06D06C:configuration file routines:NCONF_get_string:no value que é algum aviso em que não encontrei documentação.

Note ainda que, de acordo com http://www.php.net/manual/en/function.openssl-error-string.php, você poderia estar vendo erros de liderança, pois as mensagens de erro estão em fila:

Tenha cuidado ao usar esta function para verificar erros, como parece ler de um buffer de> erros, o que poderia include erros de outro script ou processo que estava usando funções openssl>. (Fiquei surpreso ao encontrá-lo returing mensagens de erro antes de ter chamado qualquer> funções 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; ?> 

algumas coisas aqui:

%PATH% também deve conter o Windows e system32 para que seu% PATH% pareça c:\windows;c:\windows\system32;E:\wamp\php e em e:\wamp\php deve ser o arquivo openssl dll

também tente a versão openssl que combina com a versão de header 0.9.8y 5 Feb 2013 baixe aqui para 32 bits e aqui para 64 bits

Este código parece funcionar para mim:

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

Eu tive um problema semelhante, para mim ajudou a configurar a variável de ambiente ‘OPENSSL_CONF’ manualmente no início do meu script.

De alguma forma, a variável de ambiente não foi configurada corretamente ou não passou para o meu php (Configuração: AMPPS, Win7 64Bit).

O exemplo de localização usado abaixo é o caminho que você precisaria usar com uma instalação AMPPS padrão, então, se você estiver usando AMPPS, basta copiar e colar:

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

Você instalou o OpenSSL através desse método? Instalando o OpenSSL no Windows

  1. Acesse http://gnuwin32.sourceforge.net/packages/openssl.htm e baixe a versão “Configuração” de “Binários”, openssl-0.9.7c-bin.exe.

  2. Clique duas vezes em openssl-0.9.7c-bin.exe para instalar o diretório OpenSSL para \ local \ gnuwin32.

  3. Volte para a mesma página, baixe a versão “Configuração” da “Documentação” e instale-a no mesmo diretório.

  4. Abra a janela da linha de comando e tente o seguinte comando: Código:

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

Se você vir a lista de comandos impressos pelo OpenSSL, você sabe que sua instalação foi feita corretamente.

Se você estiver usando Apache 2.4 + mod_fcgid, você pode especificar o arquivo OpenSSL conf, adicionando FcgidInitialEnv no arquivo httpd.conf:

 # OPENSSL CONF FcgidInitialEnv OPENSSL_CONF "D:/apps/php70/extras/ssl/openssl.cnf" 

Eu não estou usando pacote pré-configurado, como o WAMP, eu tenho o Apache do Apache Lounge e o PHP a partir do windows.php.net e configurado por mim.

Solução limpa:

  1. Baixe o arquivo (não importa qual) para os binários PHP do Windows a partir daqui: http://windows.php.net/download
  2. Dentro de você encontrar arquivo /extras/ssl/openssl.cnf
  3. Extraia openssl.cnf em algum lugar (por exemplo, “C: /WEB/PHP/extras/ssl/openssl.cnf”)
  4. Adicione a variável de sistema global OPENSSL_CONF com seu caminho usado (por exemplo, “C: \ WEB \ PHP \ extras \ openssl.cnf” (sem as aspas duplas)).

insira a descrição da imagem aqui

Você deve adicionar o caminho à variável de sistema OPENSSL_CONF . Adicioná-lo à variável do sistema Path não é suficiente! No Windows 7, você encontra a checkbox de diálogo de configurações em: “Painel de controle> Sistema e segurança> Sistema> Configurações avançadas do sistema (menu esquerdo)> Avançado (Tab)> Variáveis ​​de ambiente …”. Adicione a variável OPENSSL_CONF lá.

Não é necessário preparar o arquivo openssl.cnf antes do uso – funcionará fora da checkbox. Mas você pode, se quiser ajustar as configurações.

No meu caso, copiar os arquivos para c: \ windows \ system32 me ajudou a sair

libeay32.dll, ssleay32.dll

Pode encontrá-los em OpenSSL_INSTALL_PATH \ bin.

Posso sugerir o uso da Caixa Virtual , criar uma VM e instalar a pilha LAMP. Isso lhe dará um ambiente “mais real”. Além de solucionar problemas, o OpenSSL é mais fácil no Linux.

Com isso dito, acredito que seu problema é que você não consegue encontrar o próprio arquivo de plugin. Certifique-se de que ele vive no caminho certo e existe em sua máquina e o processo Apache corre sob as permissions para lê-lo.