调用 openssl_pkey_new() 时 xampp openssl 错误;

Posted

技术标签:

【中文标题】调用 openssl_pkey_new() 时 xampp openssl 错误;【英文标题】:xampp openssl errors when calling openssl_pkey_new(); 【发布时间】:2011-06-10 20:01:37 【问题描述】:

所以我试图让 openssl 在我的 Windows 安装 xampp(1.7.3) 上工作,它是用 OpenSSL 0.9.8l 构建的。这只是我第二次在 *amp 安装上安装 openssl,但第一次顺利进行(这是在同一台机器上安装 wamp,但我发现 xampp 更符合我的风格,所以我切换了)。

当我尝试一个简单的设置脚本时:

var_dump(getenv('OPENSSL_CONF'));
$privateKey = openssl_pkey_new();

while($message = openssl_error_string())
    echo $message.'<br />'.php_EOL;

我收到一条返回消息:

error:02001003:system library:fopen:No such process
error:2006D080:BIO routines:BIO_new_file:no such file  
error:0E064002:configuration file routines:CONF_load:system lib  

我阅读了 php.net 页面,该页面告诉我需要设置 openssl.cnf 和 ssleay.dll 环境常量的可能性,我尝试了,但没有任何改变。

OPENSSL_CONF 中的var_dump 导致路径:C:/xampp/apache/bin/openssl.cnf,这对我的机器是正确的。

我检查了 php 目录的路径(ssleay32.dll 和 libeay32.dll 所在的位置)是在我的路径系统 var 中定义的,但它不是,所以我定义了它,重新启动了我的机器,并且在这个过程中重新启动 apache,但错误消息没有变化。

我的 xampp 版本没有附带 php_openssl.dll,因此我相信 php.ini 文档应该将其从可用 .dll 列表中排除,就像我检查时所做的那样。我相信 xampp 会使用基于 zend 的扩展进行编译。

我能够从 xampp gui 启动 openssl,并且我成功地创建了一个私钥/公钥对。

phpinfo() 报告:

openssl OpenSSL 支持启用 OpenSSL 库版本 OpenSSL 0.9.8l 2009 年 11 月 5 日 OpenSSL 标头版本 OpenSSL 0.9.8l 2009 年 11 月 5 日

我认为我的系统目录中存在来自 wamp 安装的旧 ssleay.dll 和 libeay32.dll,但此后我已将其删除。 (之后重新启动,并重新启动 apache)

我尝试将openssl.cnf复制到默认目录'C:\usr\local\ssl\openssl.cnf'没有变化。

我还阅读了this 线程和this 线程,但给出的答案是相关的,但没有帮助或不存在。

有人对我接下来应该检查的内容或我遗漏的任何明显内容有任何想法吗?

【问题讨论】:

它有趣的OPENSSL_CONFC:/xampp/apache/bin/openssl.cnf,配置得很好。唯一的小问题是 Windows 使用反斜杠,而不是正斜杠。 【参考方案1】:

您检查 xampp/apache/conf/extra/http-xampp.conf 中的 OPENSSL_CONF 变量

然后使用 xampp/apache_start.bat 启动 apache 而不是 XAMPP 控制面板(奇怪的是,从控制面板启动时它不起作用[可能是当前目录问题])

这适用于 Win7 64 位上的 XAMPP 1.7.4

【讨论】:

【参考方案2】:

也许你在调用openssl_pkey_new()时需要指定openssl.cnf文件的路径:

$configArgs = array(
    'config' => '/etc/openssl/openssl.cnf',
    // ...
);
openssl_pkey_new($configArgs);

您可能还需要在$configArgs 中指定其他设置才能使该功能正常工作(最近没有测试过)。 另请参阅 http://php.net/manual/en/function.openssl-csr-new.php 以获取有关支持的更多配置参数的说明。

【讨论】:

ok 我可以试一试,我认为该函数应该根据php.net/manual/en/openssl.installation.php指定的路由查找openssl.cnf文件,但它可能无法访问环境变量? openssl.cnf的位置在哪里 这取决于您的 OpenSSL 安装。如果您在具有包管理的 Linux 系统中使用 OpenSSL,则它可能位于 /etc/openssl/ 中,如示例中所示。您可能会找到一个 Web 服务器环境变量 $_SERVER['OPENSSL_CONF'],它会为您提供位置。 只有在我将 $configArgs['config'] 明确设置为 getenv('OPENSSL_CONF') 后才为我工作。似乎 openssl_pkey_new 忽略了 env 变量并要求您明确设置配置。

以上是关于调用 openssl_pkey_new() 时 xampp openssl 错误;的主要内容,如果未能解决你的问题,请参考以下文章

无法创建新的 OpenSSL 密钥 [重复]

C#线程调用方法时,怎么传参数过去

调用 forkpty 时 X 抛出错误。 (C++)

php中rsa生成公私钥和加解密

如何在 PHP 中对文件进行数字签名

公钥-私钥