【问题标题】:gnupg with php throws "could not init keylist"带有 php 的 gnupg 抛出“无法初始化密钥列表”
【发布时间】:2013-11-29 12:03:43
【问题描述】:

尝试用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/

提前致谢!

【问题讨论】:

  • 我遇到了完全相同的问题。你能转储“php -i”输出吗?

标签: php linux gnupg


【解决方案1】:

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

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

此外,您永远不应该使用777 权限,尤其是与安全相关的程序,例如sshgnupg,它们可能会检查和拒绝,但775 可能会起作用。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我知道我迟到了,但我想分享一下我是如何解决这个问题的。首先,我尝试以 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
      • 导入您的 {public,secret} 密钥
      • 记得将/usr/sbin/nologin no-shell 恢复为/etc/passwd 中的www-data 用户

      现在这个脚本也可以像 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>";
      

      【讨论】:

        猜你喜欢
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        相关资源
        最近更新 更多