OpenSSL不能在Windows上工作,错误0x02001003 0x2006D080 0x0E064002

问题: OpenSSL不能在我的Windows环境中工作。 OpenSSL反复报告错误0x02001003,0x2006D080和0x0E064002。

环境:

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 

我试过的东西:

  • 安装说明 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
  • 重新启动
  • 的phpinfo:
    —-启用OpenSSL支持
    —- OpenSSL库版本OpenSSL 1.0.1e 2013年2月11日
    —- OpenSSL头文件版本OpenSSL 0.9.8y 2013年2月5日
  • 有和没有在configargs指定configuration
  • 有和没有在Apacheconfiguration中指定<Directory E:\wamp\php\extras>
  • 复制openssl.cnf到虚拟主机public_html,指出,仍然得到相同的错误
  • 没有任何logging在error_log
  • 研究:我花了最后2天研究这个,惊讶没有更多的信息,所以我在这里发布。 似乎是OpenSSLconfiguration或Apache / PHP不正确阅读configuration的问题。

码:

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

结果:

 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:

 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: 

编辑:

  1. 感谢@Gordon,现在我可以看到使用openssl_error_string open_ssl错误
  2. 完全卸载EasyPHP。 手动安装稳定版本的PHP / Apache。 相同的结果! 绝对是我在做一个在Windows上实现OpenSSL的错误。
  3. 手动的OpenSSL部分…附加的错误信息

最后的想法:
我设置了一个Linux的盒子,我得到了同样的错误。 在玩了一段时间之后,我发现即使它在openssl_pkey_new上抛出错误,它最终也会创build我的testingp12文件。 长话短说,这些错误是误导性的,它必须处理更多的是如何使用openssl函数,而不是如此多的服务器端configuration。

最终代码:

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

靠近。

一年后…

所以一年后我又发现自己做了这个,不pipe我在电脑上设置的PATHvariables,还是在脚本执行过程中,都会一直在找不到文件的错误。 我可以通过在config_args数组中的config参数中config_args来解决它。 这是一个testing成功使用OpenSSL的function:

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

下面的代码按预期工作。 但是,如果你运行openssl_error_string()后,openssl方法显示error:0E06D06C:configuration file routines:NCONF_get_string:no value ,这是一些通知我一直没能find文件。

此外请注意,根据http://www.php.net/manual/en/function.openssl-error-string.php你可能会看到错误的领先错误,因为错误消息排队:;

使用这个函数检查错误时要小心,因为它似乎是从一个>错误的缓冲区中读取的,这个错误可能包含来自另一个使用openssl>函数的脚本或进程的错误。 (在我调用任何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; ?> 

这里有几件事情:

%PATH%还应该包含windows和system32,所以你的%PATH%应该看起来像c:\windows;c:\windows\system32;E:\wamp\phpe:\wamp\php应该是openssl dll文件

也尝试openssl版本匹配的头版本0.9.8y 5 Feb 2013 在这里下载32位和在这里为64位

这段代码似乎为我工作:

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

我有一个类似的问题,对我来说,它有助于在我的脚本开始手动设置环境variables“OPENSSL_CONF”。

不知怎的,环境variables设置不正确,或没有通过我的PHP(安装:AMPPS,Win7的64位)。

下面使用的示例位置是您必须使用标准AMPPS安装的path,所以如果您使用的是AMPPS,请复制并粘贴:

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

你有没有通过这种方法安装OpenSSL? 在Windows上安装OpenSSL

  1. 转到http://gnuwin32.sourceforge.net/packages/openssl.htm ,并下载“Binaries”的“Setup”版本,openssl-0.9.7c-bin.exe。

  2. 双击openssl-0.9.7c-bin.exe将OpenSSL安装到\ local \ gnuwin32目录。

  3. 回到同一页面,下载“安装”版本的“文档”,并将其安装到同一目录中。

  4. 打开命令行窗口,并尝试以下命令:代码:

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

如果您看到OpenSSL打印的命令列表,则说明您的安装已正确完成。

如果您使用的是Apache 2.4 + mod_fcgid,则可以在httpd.conf文件中添加FcgidInitialEnv来指定OpenSSL conf文件:

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

我没有使用预先configuration的软件包,比如WAMP,我从Apache Lounge获取了Apache,从windows.php.net获得了PHP,并由我自己configuration​​。

清洁scheme:

  1. 从这里下载档案(不会哑光的)PHP的二进制文件: http : //windows.php.net/download
  2. 在里面find文件/extras/ssl/openssl.cnf
  3. 解压openssl.cnf(例如“C:/WEB/PHP/extras/ssl/openssl.cnf”)
  4. 添加全局系统variablesOPENSSL_CONF与您使用的path(例如“C:\ WEB \ PHP \ extras \ openssl.cnf”(不带双引号))。

在这里输入图像说明

您必须将path添加到OPENSSL_CONF系统variables。 将它添加到Path系统variables是不够的! 在Windows 7下,您可以在“控制面板>系统和安全>系统>高级系统设置(左侧菜单)>高级(选项卡)>环境variables…”下find设置对话框。 在那里添加variablesOPENSSL_CONF

在使用之前不需要准备openssl.cnf文件 – 它可以开箱即用。 但是,如果你想微调设置,你可以。

在我的情况下,将文件复制到c:\ windows \ system32帮助我

libeay32.dll,ssleay32.dll

可以在OpenSSL_INSTALL_PATH \ bin中find它们。

我可能会build议使用Virtual Box ,创build一个VM并安装LAMP堆栈。 这会给你一个“更真实”的环境。 除了解决OpenSSL在Linux上的问题。

这样说,我相信你的问题是你无法find插件文件本身。 确保它存在于正确的path中,并且存在于你的机器上,Apache运行的进程有权读取它。