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

Check if an entered public key is a valid OpenPGP key

我正在使用来自 PHP 的 GnuPG class。我在导入有效的 public 密钥时没有遇到任何问题,但是如果我尝试导入像 "test" 这样显然不是 public 密钥的随机内容,我会收到错误 502 bad gateway .我在 PHP 文档中看到 gnupg_keyinfo 显示了介绍密钥环中存储的名称的信息。我在互联网上搜索了一下,但没有找到一种方法来检查输入的 public 密钥的格式是否正确。 我正在使用以下代码:

<?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" 表示网络服务器与其背后的某些东西之间的连接中断了——例如,当将 nginx 与 php-fpm 一起使用时会发生这种情况,这是通过另一个网络访问的connection/socket。在请求进一步调试信息的评论中,您确认了猜测,并且还意识到 php 由于 segmentation fault 而崩溃,这意味着应该访问了一些无效的内存位置。

这可能是因为错误(在这种情况下我不希望出现这种情况,因为无效密钥并不是完全令人惊讶的输入,没有人会测试)或者因为编译版本并不真正适合在一起。你解释说你自己构建了一些部分。

调试它很麻烦,通常需要花费数小时,您需要附加一个调试器并意识到哪里出了问题。如果有机会,请尝试从您选择的包管理器中安装所有内容,不要使用不同的源,如 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]