gnupg与php抛出“无法初始化密钥列表”

时间:2013-11-29 12:03:44

标签: php linux gnupg

尝试使用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网络服务器: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 .

debug.log显示以下错误:

_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/

提前致谢!

3 个答案:

答案 0 :(得分:2)

从命令行运行时,您指定的GNUPGHOME路径相对于运行脚本时的工作目录。从Web环境中,您不能依赖于特定的工作目录,因此您可能需要指定gnupg目录的完整绝对路径。但是,您可以指定相对于当前脚本的路径:

putenv('GNUPGHOME='.dirname(__FILE__).'/gnupg');

此外,您不应该使用777权限,尤其是与sshgnupg等安全相关的可能会检查和拒绝的程序,但775可能有工作

答案 1 :(得分:0)

问题源于php5版本的gnupg仅支持gnupg的版本1。但是,debian / ubuntu版本的libgpgme11-dev是使用gpg版本2编译的。

我无法使用gpg.conf找到一个干净的解决方案来指定使用哪个版本的gpg引擎。所以,我最终从我的系统中删除(apt-get remove)gpg2(和libgpgme11-dev)并从源代码编译GPGME。然后我重新安装了php5 gnupg扩展,一切都很好。

答案 2 :(得分: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)< / li>
  • 以www-data的形式打开交互式外壳:sudo -u www-data -i
  • 使用gpg --gen-key生成密钥环(它将创建具有适当权限的/var/www/.gnupg文件夹
  • 导入您的{public,secret}键
  • 请记住,将/usr/sbin/nologin的{​​{1}}无壳还原为www-data用户

现在此脚本也可以像www-data一样正常工作:)

/etc/passwd