2015-02-07 59 views
1

更新

顯然,即使我想我是生成沒有密碼的密鑰,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

回答

1

是您的私鑰密碼保護? 根據pecl/gnupg documentation你不能傳遞gnupg≥版本2的明文密碼。 所以你所能做的只是使用一個私鑰沒有密碼設置,我猜。

IMO pecl/gnupg錯誤頗具誤導性。

+0

它沒有密碼保護,我甚至還創建了一個新的密鑰對。我把這件事撕成碎片。 – Spectre 2015-02-07 14:34:49

+0

進一步的故障排除後,您是對的。我故意在沒有密碼的情況下生成了以前的密鑰,但顯然它仍然設置了一些內容。因此,我在Windows上使用Kleopatra創建了一個全新的密鑰對,並繞過了所有「無密碼」警告 - 這項工作已成功完成。謝謝! – Spectre 2015-02-07 20:40:16