针对windows系统如何解决openssl_pkey_export(): cannot get key from parameter 1这个问题
为了解决这个问题我百度了很多方法,可是很多方法并没有效果。
方法一:
如果你安装的是phpstudy这个集成环境,那么
1、你就要去php拓展里面去打开php_opemssl中打开这个扩展。
2、去php.ini里面设置,把“extension=php_openssl.dll”前面的“;”去掉,如果没有这个就添加extension=php_openssl.dll这个。
3、复制php安装目录中的: libeay32.dll、ssleay32.dll至c:\windows\system32(如果是apache这两个文件在e:\phpstudy\phptutorial\php\php-7.0.12-nts)。
4、复制php_openssl.dll至c:\windows\system32(如果是apache,那么这个文件在e:\phpstudy\phptutorial\php\php-7.0.12-nts\ext)。
5、重启iis或者apache环境
如果方法一还是没有用,那么你可以在环境变量中去添加一个变量试试看,
-
this may help if you are on windows:
- click on the start button
- click on control panel
- click on system and security
- click on system
- click on advanced system settings
- click on environment variables
- under "system variables" click on "new"
- enter the "variable name" openssl_conf
- enter the "variable value". my is - c:\wamp\bin\apache\apache2.2.17\conf\openssl.cnf
- click "ok" and close all the windows and restart your computer.
-
the openssl should be correctly working.
这个意思是设置一个环境变量,将openssl.cnf的路径放到环境变量中,这个我是在国外的论坛看到的方法,但是效果也不好。
方法二:
代码为
1 <?php 2 3 $configs['config'] = 'e:\phpstudy\phptutorial\apache\conf\openssl.cnf'; 4 5 $config = array( 6 //"digest_alg" => "sha512", 7 "private_key_bits" => 512, //字节数 512 1024 2048 4096 等 8 "private_key_type" => openssl_keytype_rsa, //加密类型 9 ); 10 11 //创建公钥和私钥 返回资源 12 $res = openssl_pkey_new($config+$configs); 13 14 //从得到的资源中获取私钥 并把私钥赋给$<span style="font-family: arial, helvetica, sans-serif;">privkey</span> 15 openssl_pkey_export($res, $privkey, null, $config); 16 17 //<span style="font-family: arial, helvetica, sans-serif;">从得到的资源中获取公钥 返回公钥 </span><span style="font-family: arial, helvetica, sans-serif;">$pubkey</span><span style="font-family: arial, helvetica, sans-serif;"> 18 $pubkey = openssl_pkey_get_details($res); 19 20 $pubkey = $pubkey["key"]; 21 //var_dump($privkey); 22 //var_dump($pubkey); 23 var_dump(array('privkey'=>$privkey,'pubkey'=>$pubkey)); 24 die;
结果为
array(2) { ["privkey"]=> null ["pubkey"]=> string(182) "-----begin public key----- mfwwdqyjkozihvcnaqebbqadswawsajbapskeat0a8zzkbjwsph22wn2m3mi947x 7wbmdnaju94lmtz4uvsqjvmvsmgc35ocmhqr3c5hufaljcmyyxu3iekcaweaaq== -----end public key----- " }
但是这个方法不是很理想,因为每次生成公钥和私钥都要调用$configs['config'] = 'e:\phpstudy\phptutorial\apache\conf\openssl.cnf';,是不是有点麻烦呀,哈哈哈,好了,给你最后一个方法,个人觉得这个方法倒是挺好的
方法三:
首先在phpinfo中找到如下图所示
创建对应的路径,将apache中的openssl.cnf复制进去,然后就可以尝试测试结果了
测试方法:
1 <?php 2 3 $config = array( 4 "digest_alg" => "sha512", 5 "private_key_bits" => 4096, //字节数 512 1024 2048 4096 等 ,不能加引号,此处长度与加密的字符串长度有关系,可以自己测试一下 6 "private_key_type" => openssl_keytype_rsa, //加密类型 7 ); 8 $res = openssl_pkey_new($config); 9 10 //提取私钥 11 openssl_pkey_export($res, $private_key); 12 13 //生成公钥 14 $public_key = openssl_pkey_get_details($res); 15 // var_dump($public_key); 16 17 $public_key=$public_key["key"]; 18 19 //显示数据 20 var_dump($private_key); //私钥 21 echo "<br/>"; 22 var_dump($public_key); //公钥 23 echo "<br/>"; 24 //要加密的数据 25 $data = "http://www.cnblogs.com/wt645631686/"; 26 echo '加密的数据:'.$data."\r\n"; 27 echo "<br/>"; 28 //私钥加密后的数据 29 openssl_private_encrypt($data,$encrypted,$private_key); 30 31 //加密后的内容通常含有特殊字符,需要base64编码转换下 32 $encrypted = base64_encode($encrypted); 33 echo "私钥加密后的数据:".$encrypted."\r\n"; 34 echo "<br/>"; 35 //公钥解密 36 openssl_public_decrypt(base64_decode($encrypted), $decrypted, $public_key); 37 echo "公钥解密后的数据:".$decrypted,"\r\n"; 38 echo "<br/>"; 39 //----相反操作。公钥加密 40 openssl_public_encrypt($data, $encrypted, $public_key); 41 $encrypted = base64_encode($encrypted); 42 echo "公钥加密后的数据:".$encrypted."\r\n"; 43 echo "<br/>"; 44 openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key);//私钥解密 45 echo "私钥解密后的数据:".$decrypted."n"; 46 47 echo "<br/>"; 48 49 echo "---------------------------------------分割线---------------------------------------"; 50 51 echo "<br/>";