【问题标题】:PHP gnupg part of functions are not workingPHP gnupg 部分功能不起作用
【发布时间】:2019-02-18 13:59:27
【问题描述】:

我刚刚安装了 gnupg pecl 扩展和所需的库,在我的 phpinfo() 中似乎启用了 gnupg;

php -i | grep gnupg

/etc/php/7.3/cli/conf.d/20-gnupg.ini,
gnupg
gnupg support => enabled

当我尝试调用 gnupg_init() 时它成功并给我资源 ID 但后来我尝试了 gnupg_import,但它总是失败并返回 false

当我尝试在 shell 中执行命令时:gpg --import somekey.txt 它可以工作 这是我的测试test.key:

-----BEGIN PGP PUBLIC KEY BLOCK-----

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
Epd4OakW3tIP+3vqfv0nJ+weizFNq5Tj
=wIHb
-----END PGP PUBLIC KEY BLOCK-----

在我的 Web 应用程序中使用 gpg 之前,我是否必须以某种方式初始化它?请指出我正确的方向

通过指纹导出先前导入的密钥:

gpg --export --armor B4A57058391D51C5853BBFA317916E7C04C17179 > /var/www/test/test.key

下面是我的test.php:

<?php
$key=file_get_contents('/var/www/test/test.key');
$gpg=gnupg_init();
print_r($gpg); //returns Resource id #7 
$res=gnupg_import($gpg, $key);
print_r($res); //returns empty string
var_dump($res); //returns (bool)false
$er=gnupg_geterror($gpg);
var_dump($er); //return (bool)false
?>

附言使用 nginx+php7.3-fpm 和 gpg 1.4.23 我的 gnupg 主目录位于 /var/www/.gnupg 属于 nginx/php 用户,并且需要权限 600/700

【问题讨论】:

  • 您的 PHP 错误日志中是否有任何警告,或者带有 ini_set('display_errors', 'on'); error_reporting(E_ALL);?通常,在失败时返回 false 的函数会引发描述特定错误的警告。
  • 我收到了这个警告:php-fpm7.3[31083]: [15-Feb-2019 05:02:50] 注意:PHP 消息:PHP 警告:模块 'gnupg' 已加载到未知中在第 0 行。error_reporting 为 E_ALL display_errors=On
  • @МишкаОлимпийский 在您的gnupg_import() 调用失败后,gnupg_geterror() 的返回值是多少?
  • @Progman (bool)false
  • @МишкаОлимпийский 请编辑您的问题以包含您现在拥有的源代码以及添加的gnupg_geterror() 检查。

标签: php import gnupg


【解决方案1】:

这里可能有换行符出错,因为您发布的是密钥内容而不是实际的密钥文件。请将该字段替换为上传文件字段,它应该不会导致换行问题(只要您没有编辑导出的密钥,但我会再次导出它们,以确保)

我刚刚尝试过,装甲和普通的公共导出文件都可以与 gnupg_import 一起正常工作。我试过的代码:

//gpg --export --armor 4E8D5B22A24A1CFFA5BD2E771A9A0D703BDDF81B > public-armor.key
$PublicData = file_get_contents('public-armor.key');
$res=gnupg_import($gpg, $PublicData);
var_dump($res); 
$er=gnupg_geterror($gpg);
var_dump($er); 

我的输出:

array(9) {
  'imported' =>
  int(0)
  'unchanged' =>
  int(1)
  'newuserids' =>
  int(0)
  'newsubkeys' =>
  int(0)
  'secretimported' =>
  int(0)
  'secretunchanged' =>
  int(0)
  'newsignatures' =>
  int(0)
  'skippedkeys' =>
  int(0)
  'fingerprint' =>
  string(40) "4E8D5B22A24A1CFFA5BD2E771A9A0D703BDDF81B"
}
/tmp/so_5469155777_test_php_gnupg.php:12:
bool(false)

编辑:我只是在 DO droplet 上对其进行了一次旋转以确认错误,虽然它很奇怪,但它确实存在。 请修改您的密钥的开头:

-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1

到:

-----BEGIN PGP PUBLIC KEY BLOCK----- 

而且一切都会很好。 (是的,只需从中删除版本信息)

【讨论】:

  • 嘿,请看我的编辑,它应该可以为您解决问题
  • 感谢您的宝贵时间,但我忘了更新这部分问题,因为装甲导出已经剥离了版本的关键,并且它没有做任何更改
  • 您是否还确保密钥文件被换行符分割?因为它不是如果您将 SO 密钥复制粘贴到文件中。 (如果你这样做了,请更新 SO 问题,以便密钥包含换行符,=wIHb 也应该在自己的行中)
  • 嗨,伙计! “=wIHb”已经在它自己的行上。由于我已经导出了已经导入密钥环的密钥,所以格式化应该没有问题。我倾向于得出 pecl gnupg 扩展或 gpg 本身安装错误的结论。可能是我必须在使用之前以某种方式初始化它吗?
  • 你不必初始化它。在“干净”的服务器上,我只安装了 php-gnupg + php7.3(来自 ondrej PPA),这就是我需要做的一切才能让它工作。密钥和代码在那里工作正常。您是否尝试过使用 CLI?还是您只是遇到了我在stackoverflow.com/a/54732387/2129097 上描述的 nginx 权限问题?
猜你喜欢
  • 2018-07-16
  • 2013-01-30
  • 2014-03-05
  • 2018-03-20
  • 2013-04-18
  • 2011-11-03
  • 2018-07-17
  • 2014-05-19
  • 2011-04-07
相关资源
最近更新 更多