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


Check if an entered public key is a valid OpenPGP key

我使用的是PHP中的GnuPG类。我导入有效的公钥没有任何问题,但如果我试图导入一些随机的东西,比如"测试",它显然不是公钥,我会收到错误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>

错误502"Bad Gateway"表示web服务器与其背后的东西之间的连接中断——例如,当将nginx与php-fpm一起使用时,就会发生这种情况,而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]