-1

私はphpseclibがopensslを必要としないという印象を受けましたが、次のコードを試してみると...

$rsa = new Crypt_RSA();
$key = $rsa->createKey();

openssl 関数を使用している場合、次のエラーが表示されます。混乱している。

Warning: openssl_pkey_export(): cannot get key from parameter 1 in /RSA.php on line 509  

Warning: openssl_pkey_get_details() expects parameter 1 to be resource, boolean given in /RSA.php on line 510  

Warning: array_values() expects parameter 1 to be /RSA.php on line 513  

Warning: call_user_func_array() expects parameter 2 to be array, null given in /RSA.php on line 513  

Warning: array_values() expects parameter 1 to be array, boolean given in /RSA.php on line 514

Warning: call_user_func_array() expects parameter 2 to be array, null given in /RSA.php on line 514 
4

1 に答える 1

0

phpseclibは、OpenSSLが利用可能な場合はそれを使用しますが、必須ではありません。

短期的な修正

一番上で行いますdefine('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);

長期的な修正

これがあなたのために何をするかを見るのは興味深いでしょう:

#
#-----[ OPEN ]------------------------------------------
#
Crypt/RSA.php
#
#-----[ FIND ]------------------------------------------
#
            $rsa = openssl_pkey_new(array(
                'private_key_bits' => $bits,
                'config' => dirname(__FILE__) . '/../openssl.cnf'
            ));
#
#-----[ AFTER, ADD ]------------------------------------
#
echo dirname(__FILE__) . "/../openssl.cnf\r\n";
echo file_exists(dirname(__FILE__) . '/../openssl.cnf') ? "exists\r\n" : "doesn't exist\r\n";

それで問題が解決するわけではありませんが、問題が何であるかについての手がかりが得られます。特に、私が問題だと思っているのはこれです:

https://github.com/phpseclib/phpseclib/blob/0.3.1/phpseclib/Crypt/RSA.php#L503

phpseclibは、CRYPT_RSA_MODE_OPENSSLを定義するときにOpenSSL拡張機能が定義されているかどうかを確認しますが、openssl.cnfが使用されているときに存在するかどうかは確認しません。おそらく開発者側の見落としであり、それが問題の原因である場合、永続的な長期的な修正は、phpseclibにそのファイルの存在をチェックさせることです。

于 2013-03-16T17:59:17.690 に答える