-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 回答