針對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/>";


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM