Php OpenSSL在Windows上不工作,错误0x020001003 0x2006D080 0x0E064002

Php OpenSSL在Windows上不工作,错误0x020001003 0x2006D080 0x0E064002,php,apache,apache2,openssl,easyphp,Php,Apache,Apache2,Openssl,Easyphp,问题:OpenSSL在我的Windows环境中不工作。OpenSSL重复报告错误0x0201003、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:\Projec

问题:OpenSSL在我的Windows环境中不工作。OpenSSL重复报告错误0x0201003、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
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
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:
我的尝试:

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
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
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:
  • 安装说明
  • PHP.ini
    extension=PHP\u 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
  • 在apache配置中指定和不指定
  • 已将
    openssl.cnf
    复制到virtualhost public_html,指出了这一点,但仍然会收到相同的错误
  • 未登录任何内容错误\u日志
  • 研究:我花了两天时间研究这个,很惊讶没有更多的信息,所以我在这里发布。OpenSSL配置或apache/php没有正确读取配置似乎有问题
代码:

$privateKey = openssl_pkey_new();
while($message = openssl_error_string()){
    echo $message.'<br />'.PHP_EOL;
}
手动打开SSL:

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
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
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:
编辑:

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
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
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:
  • 多亏了@Gordon,我现在可以使用
    openssl\u error\u string
  • 完全卸载EasyHP。手动安装的PHP/Apache稳定版本。同样的结果!在windows上实现openssl肯定是我做错了什么
  • OpenSSL手动部分。。。附加错误信息
  • 最后的想法:
    我设置了一个linux机器,但我得到了相同的错误。在玩了一些游戏之后,我发现即使它在openssl_pkey_new上抛出错误,它最终还是创建了我的测试p12文件。长话短说,这些错误具有误导性,它必须更多地处理您使用openssl函数的方式,而不是服务器端配置

    最终代码:

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

    一年后…

    所以我发现自己在一年后又这样做了,不管我在计算机上或脚本执行期间设置了什么路径变量,它都会不断地出现关于找不到文件的错误。我可以通过在
    openssl\u pkey\u new
    中的
    config\u args
    数组中传递
    config
    参数来解决这个问题。下面是一个测试成功使用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>";
        }
    
    /**
    *测试1)创建pub/priv密钥对2)提取pub/priv密钥3)使用密钥加密明文4)使用密钥解密的能力
    * 
    *@return boolean |失败时字符串为False,成功时字符串为False
    */
    函数testOpenSSL($opensslConfigPath=NULL)
    {
    if($opensslConfigPath==NULL)
    {
    $opensslConfigPath=“E:/Services/Apache/httpd-2.4.9-win32-VC11/conf/openssl.cnf”;
    }
    $config=array(
    “config”=>$opensslConfigPath,
    “摘要”=>“sha512”,
    “私钥位”=>4096,
    “私钥类型”=>OPENSSL密钥类型RSA,
    );
    
    $res=openssl\u pkey\u new($config);//下面的代码按预期工作。但是如果在openssl方法之后运行
    openssl\u error\u string()
    ,它会显示
    error:0E06D06C:configuration file routines:nConof\u get\u string:no value
    ,这是我无法找到文档的注意事项

    进一步注意,根据您的报告,当错误消息排队时,您可能会看到错误引导错误:

    使用此函数检查错误时要小心,因为它似乎是从>错误的缓冲区中读取的,其中可能包括来自使用openssl>函数的另一个脚本或进程的错误。(我惊讶地发现,在调用任何>openssl_*函数之前,它都会返回错误消息)


    下面的代码按预期工作。但是如果在openssl方法之后运行
    openssl\u error\u string()
    ,它会显示
    错误:0E06D06C:配置文件例程:NCONF\u get\u string:no value
    ,这是我无法找到相关文档的注意事项

    进一步注意,根据您的报告,当错误消息排队时,您可能会看到错误引导错误:

    使用此函数检查错误时要小心,因为它似乎是从>错误的缓冲区中读取的,其中可能包括来自使用openssl>函数的另一个脚本或进程的错误。(我惊讶地发现,在调用任何>openssl_*函数之前,它都会返回错误消息)


    您是否通过此方法安装了OpenSSL? 在Windows上安装OpenSSL

  • 转到并下载“二进制文件”的“安装”版本openssl-0.9.7c-bin.exe

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

  • 返回同一页面,下载“文档”的“安装”版本,并将其安装到同一目录

  • 打开“命令行”窗口,然后尝试以下命令: 代码:

  • \local\gnuwin32\bin\openssl-help
    openssl:错误:'-help'是无效命令。
    标准命令
    ASN1解析ca密码crl crl2pkcs7
    dgst dh dhparam dsa dsa dsaparam
    enc发动机errstr gendh gendsa
    genrsa nseq ocsp密码pkcs12
    pkcs7 pkcs8随机请求rsa
    rsautl s_客户端s_服务器s_时间sess_id
    smime speed spkac验证版本
    x509
    ......
    
    如果您看到OpenSSL打印的命令列表,您可以