【问题标题】:phpseclib is using openssl during create key?phpseclib 在创建密钥期间使用 openssl?
【发布时间】:2013-03-04 18:02:13
【问题描述】:

我的印象是 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 

【问题讨论】:

  • 安装有一个openssl.cnf 文件,所以它看起来可能需要 OpenSSL。你在哪里读到它没有?
  • 该网站声称“它适用于 PHP4+ [...] 并且不需要任何扩展”phpseclib.sourceforge.net
  • 如果它确实需要openssl,我一直在尝试找到一种在Ubuntu 12上使用openssl安装php的快速方法。我担心用openssl编译php会很容易,但我不知道将手动编译安装集成到 apache2 中是多么容易。任何有用的资源都会有所帮助(如果需要 openssl)。
  • 该网站说:“phpseclib 被设计为超级兼容。它适用于 PHP4+(PHP4,假设使用 PHP_Compat)并且不需要任何扩展。出于速度的目的, 如果 mcrypt 作为 gmp 或 bcmath 可用(按此顺序),则使用 mcrypt,但它们不是必需的。“我认为 mcrypt 反过来可能会使用 openssl,至少用于随机数生成,当它可用时.
  • 您已经安装了 OpenSSL。如果你不这样做,openssl_pkey_export 函数甚至不会存在,但它确实存在。我认为问题在于您没有 openssl.cnf 存在 phpseclib 期望的地方。有关更多信息,请参阅我的答案。

标签: php encryption rsa phpseclib


【解决方案1】:

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 检查该文件是否存在。

【讨论】:

  • 当然我会试试你的“有趣的解决方案”
  • 输出是什么?就像我在帖子中所说的那样“这不会解决问题”,但“它会给我们一些关于问题所在的线索”。
  • 我添加并执行了 RSA.php 文件,但一无所获?我应该包含它并运行命令吗? (我即将尝试短期解决方案)
  • 哦,等等,我刚刚在另一个页面上看到了这个:/backend/phpseclib0.3.1/../openssl.cnf 不存在
  • 这就是我认为你会得到的。做短期修复,我会向作者提交一个拉取请求。这就像一条线修复。感谢您回复我!
猜你喜欢
  • 2022-12-04
  • 1970-01-01
  • 2012-12-09
  • 2016-10-28
  • 1970-01-01
  • 2013-06-14
  • 2021-01-22
  • 1970-01-01
  • 2015-10-14
相关资源
最近更新 更多