检查输入的公钥是否是有效的OpenPGP密钥。

3
我正在使用PHP的GnuPG类。我没有任何问题导入有效的公钥,但如果我尝试导入一些随机的东西,比如“test”,显然不是公钥,我会收到502错误网关的错误。我查看了PHP文档,发现gnupg_keyinfo显示存储在密钥环中的名称的信息。我在互联网上搜索了一下,没有找到检查输入的公钥格式是否正确的方法。 我正在使用以下代码:
<?php
putenv('GNUPGHOME=/home/kevin/.gnupg');
$gpg = '/usr/bin/gpg';
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION); 

if(isset($_POST['2fa'])){
    try {
      $key = $_POST['new_pgp'];
      $retVal = $gpg->import($key);
      echo $retVal['imported'] . ' key(s) imported.';
    } catch (Exception $e) {
      die('ERROR: ' . $e->getMessage());
    }

}
?>
<html>
<body>
<form action="pgp.php" method="post">
<textarea name="new_pgp"></textarea><br>
<input type="submit" name="2fa" value="Send">
</form>
</body>
</html>

可能是PHP检查GPG/PGP公钥是否有效的重复问题。 - Oxi
在我看来,不是一样的。我正在使用GnuPG类,并阅读以下文档:https://secure.php.net/manual/en/function.gnupg-import.php,如果导入过程失败,则该方法将返回FALSE。如果我输入正确的pgp,我的表单可以正常工作,没有任何问题,但是如果我输入虚假的pgp,我的表单只会抛出502错误网关,我想控制这种类型的错误,但我不知道如何检查pgp是否正确。@Oxi - Kevin Gravell
我在我的问题中更新了我的代码@maxhb。 - Kevin Gravell
似乎连接意外断开。在'dmesg'或系统日志中是否有任何与崩溃/内核转储有关的内容? - Jens Erat
发生了一些内存访问违规。这是PHP或GnuPG中的某个bug。你是如何安装GnuPG和PHP模块的?很有可能版本不太匹配。为了进行更深入的分析,我担心下一步将是附加调试器并深入研究问题——这超出了本站的范围。确保你通过系统的软件包管理器安装了所有内容,这样至少不会遇到版本不同的问题。 - Jens Erat
显示剩余5条评论
1个回答

1
一个502错误“Bad Gateway”表示Web服务器和其后面的某些东西之间的连接中断了--例如,在使用nginx与php-fpm一起使用时,就会发生这种情况,该服务器通过另一个网络连接/套接字进行访问。在请求进一步的调试信息的评论中,您确认了这个猜测,并意识到php由于分段错误而崩溃,这意味着应该访问了一些无效的内存位置。

这可能是由于错误(在这种情况下我不希望出现错误,因为无效的键不是完全令人惊讶的输入,没有人会测试)或者编译版本实际上不太匹配。您解释了自己构建了一些部分。

调试这个问题很麻烦,通常需要数小时,您需要附加调试器并了解出了什么问题。如果有机会,请尝试从所选择的软件包管理器安装所有内容,不要使用不同的源,如PECL和您的打包程序管理器,以避免出现问题。在Debian(很可能也是Ubuntu和其他发行版,我没有验证),一些软件包,如php5-gnupg应该可用:

$ apt-cache show php5-gnupg
Package: php5-gnupg
Source: php-gnupg
Version: 1.3.6-1
Installed-Size: 84
Maintainer: Debian PHP PECL Maintainers <pkg-php-pecl@lists.alioth.debian.org>
Architecture: amd64
Depends: phpapi-20131226, php5-common (>= 4.4), libc6 (>= 2.4), libgpgme11 (>= 1.2.0)
Description-en: wrapper around the gpgme library
 This extension provides methods to interact with gnupg.
[snip]

抱歉再次打扰您...我已经转移到Debian,安装了nginx、php等。如果我执行 $ apt-cache show php5-gnupg,它不会显示任何内容,我在Synaptic中搜索php5-gnupg,但没有显示任何带有该名称的软件包。我从浏览器下载了软件包,并安装了php5-common和lipgpgme11,但我不知道如何安装phpapi-20131226,当我执行 $ dpkg -i php5-gnupg_1.3.3-1+b1_amd64.deb 时,它要求phpapi-20131226。您能给我一点指导吗?再次感谢@JensErat。 - Kevin Gravell
你安装了哪个Debian版本?该软件包自Debian 8(Jessie)起就可用,这也是当前稳定版本。 - Jens Erat
哦该死,我有Debian 7.8……如果我在Debian 8上安装它,是否可以顺利进行?@JensErat - Kevin Gravell
你可能可以添加Jessie / stable存储库并从那里安装软件包(这是许多人在他们的桌面上做的事情,基于稳定版本并从测试/实验中获取软件包),但有时会遇到依赖关系的问题。是否有任何阻止您升级到8的问题? - Jens Erat

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