GnuPG与PHP一起使用出现“无法初始化密钥列表”的错误。

5
尝试使用gnupg加密邮件时,调用gnupg::keyinfo()方法会抛出错误could not init keylist
以下是我初始化扩展的方式:
putenv('GPGME_DEBUG=9:./gnupg/debug.log');
putenv('GNUPGHOME=./gnupg/');

$this->gpg = new gnupg();
$this->gpg->seterrormode(gnupg::ERROR_EXCEPTION);

在确实存在gnupg的地方(调用is_dir('./gnupg')返回true-我也尝试过绝对路径,但没有成功)。

一些额外的信息:

  • 完全相同的代码使用PHP-CLI可以工作。(然而,我需要用HTTP)
  • 我正在使用ubuntu web服务器:Linux name 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:39:51 UTC 2012 x86_64 GNU/Linux
  • gnupg版本:gpg --version->gpg (GnuPG) 1.4.10
  • 基础设施:client->nginx->apache->php 5.3
  • 为了测试,我已经递归地设置了文件权限:drwxrwxrwx 4 www-data web1 4096 29. Nov 12:30 .

调试日志显示以下错误:

_gpgme_io_set_close_notify (fd=0x282): enter: close_handler=0x7f6d2a409780/0x7f6d38edb730
_gpgme_io_set_close_notify (fd=0x282): error: Invalid argument

完整的调试日志已上传至此处:http://nopaste.penguinfriends.org/view/84317/
提前感谢!

我遇到了完全相同的问题。你能否提供“php -i”命令的输出结果? - David
3个回答

2
当您从命令行运行时,所指定的GNUPGHOME路径是相对于运行脚本时所在的工作目录的。在Web环境中,您无法依赖于特定的工作目录,因此可能需要指定gnupg目录的完整绝对路径。但是,您可以相对于当前脚本指定路径。
putenv('GNUPGHOME='.dirname(__FILE__).'/gnupg');

此外,您不应该使用777权限,特别是与安全相关的程序,如sshgnupg,它们可能会进行检查并拒绝,但775可能有效。

0

我知道我来晚了,但我想分享一下我是如何解决这个问题的。首先,我尝试以Apache用户身份执行脚本(从命令行以自己的用户身份执行可以无缝运行,正如OP所述):

# su -s /bin/bash -c '/usr/bin/php /var/www/html/gnupg.php' www-data

这就是我得到相同错误的地方。所以我尝试了一些方法:

  • 临时/etc/passwd中为www-data添加了/bin/bash,以使用适当的shell执行某些命令(将/usr/sbin/nologin替换为/bin/bash
  • 作为www-data打开交互式shell:sudo -u www-data -i
  • 使用gpg --gen-key生成密钥环(它将创建具有适当权限的/var/www/.gnupg文件夹)
  • 导入您的{公共、私有}密钥
  • 记得在/etc/passwd中将www-data用户的/usr/sbin/nologin无shell恢复

现在这个脚本已经按预期工作,也可以作为www-data用户运行 :)

<?php

// make sure that this folder is NOT accesible as an URL
putenv("GNUPGHOME=/var/www/.gnupg/");

error_reporting(E_ALL);
$res = gnupg_init();
gnupg_seterrormode($res,GNUPG_ERROR_WARNING);

$info = gnupg_keyinfo($res, '');
echo "Key - Info<pre>";
var_dump($info);
echo "</pre>";

0
问题源于php5版本的gnupg仅支持gnupg的版本1。然而,debian/ubuntu版本的libgpgme11-dev是使用gpg版本2编译的。
我无法找到使用gpg.conf指定要使用的gpg引擎版本的干净解决方案。所以,我最终从系统中删除了(apt-get remove)gpg2(和libgpgme11-dev),并从源代码编译了GPGME。然后,我重新安装了php5 gnupg扩展程序,一切都很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接