针对windows系统如何解决openssl_pkey_export(): cannot get key from parameter 1这个问题

Posted 我爱读活法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了针对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环境

如果方法一还是没有用,那么你可以在环境变量中去添加一个变量试试看,

  1. This may help if you are on windows:

  2. Click on the START button
  3. Click on CONTROL PANEL
  4. Click on SYSTEM AND SECURITY
  5. Click on SYSTEM
  6. Click on ADVANCED SYSTEM SETTINGS
  7. Click on ENVIRONMENT VARIABLES
  8. Under "System Variables" click on "NEW"
  9. Enter the "Variable name" OPENSSL_CONF
  10. Enter the "Variable value". My is - C:\\wamp\\bin\\apache\\Apache2.2.17\\conf\\openssl.cnf
  11. Click "OK" and close all the windows and RESTART your computer.
  12. 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/>";

以上是关于针对windows系统如何解决openssl_pkey_export(): cannot get key from parameter 1这个问题的主要内容,如果未能解决你的问题,请参考以下文章

如何避免windows系统开机启动每次都弹出AutoIt报错

vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法

如何让 Windows 中的 Visual Studio Code 针对 WSL 区分大小写?

如何针对游戏性能优化Windows 10

win10 c盘空间不足如何解决呢?

如何在 Windows 上创建针对 WPF 的 .NET 核心库?