更新
顯然,即使我想我是生成沒有密碼的密鑰,GnuPG的仍然預計他們的密碼(這GnuPG的擴展不再支持)。我使用Windows上的Kleopatra重新生成了一個新的密鑰對,並繞過了所有「無密碼」警告,並且我能夠使用這些密鑰成功簽名/加密。PHP的GnuPG - 簽約消息未能
所以,底線是非常確定您的密鑰沒有密碼。
我試圖登錄使用PHP的GnuPG的擴展的消息。我的環境設置正確,並且我可以成功導入密鑰,並使用gnupg_addsignkey
成功添加它(返回true)。
當我嘗試登錄使用gnupg_sign($res, "my message")
消息,我收到以下錯誤並gnupg_sign返回false:
gnupg_sign(): data signing failed
我似乎無法找到任何方式來獲得更詳細的信息,弄清楚爲什麼它失敗了。
我試過程序方法,以及面向對象的方法,並得到相同的結果。服務器上的權限都是正確的。
下面是我使用的面向對象的代碼:
# /tmp/.gnupg is there (but empty if that helps figure out the problem)
putenv("GNUPGHOME=/tmp/.gnupg");
$gpg = new gnupg();
$gpg->seterrormode(GNUPG_ERROR_WARNING);
$ascii = file_get_contents('/etc/my.key'); // Yes, this reads successfully
$start = strpos($ascii, '-----BEGIN PGP PRIVATE KEY BLOCK-----');
$end = strpos($ascii, '-----END PGP PRIVATE KEY BLOCK-----')+34;
$key = substr($ascii, $start, ($end-$start));
$info = $gpg->import($key); // Fingerprint is there and everything seems OK
$gpg->addsignkey($info['fingerprint']);
$signed = $gpg->sign("test!"); // fails with any string I try
$signed
是假的,我得到的PHP警告gnupg::sign(): data signing failed
它沒有密碼保護,我甚至還創建了一個新的密鑰對。我把這件事撕成碎片。 – Spectre 2015-02-07 14:34:49
進一步的故障排除後,您是對的。我故意在沒有密碼的情況下生成了以前的密鑰,但顯然它仍然設置了一些內容。因此,我在Windows上使用Kleopatra創建了一個全新的密鑰對,並繞過了所有「無密碼」警告 - 這項工作已成功完成。謝謝! – Spectre 2015-02-07 20:40:16