Как использовать GNUPG и Crypt_GPG

Я пытаюсь использовать GNUPG и Crypt_GPG для шифрования данных, готовых к отправке по электронной почте на клиентский сервер, но у меня проблемы с его настройкой.

  1. Я установил GNUPG на сервер, и он отлично работает, расположен в /home/myserver/.gnupg
  2. Я установил Crypt_GPG в /home/myserver/php/Crypt и отредактировал различные файлы, чтобы они имели абсолютные ссылки друг на друга. Они работают нормально.
  3. Я использовал свой сервер CPanel для создания тестового открытого/секретного ключа. Ключ сгенерировался нормально.

Вот мой тестовый код (с включенным режимом отладки)

<?php
require_once '/home/myserver/php/Crypt/GPG.php';

$gpg = new Crypt_GPG(array('homedir' => '/home/myserver/.gnupg', 'debug' => true));
echo "My public key is: ", $gpg->exportPublicKey('[email protected]'), "<br>";
echo "My key fingerprint is: ", $gpg->getFingerprint('[email protected]', Crypt_GPG::FORMAT_CANONICAL), "<br>";

$data = 'Hello, World!';
$gpg->addSignKey('[email protected]');
$signedData = $gpg->sign($data, Crypt_GPG::SIGN_MODE_CLEAR);
echo "<br><br>Clearsigned message is: ", $signedData, "\n";

?>

Первый раздел кода работает хорошо — открытый ключ извлекается, отображается, а также отображается отпечаток пальца.

Проблема со вторым блоком кода — на самом деле пытается что-то зашифровать. Я получаю эти ошибки в выводе отладки. Я не буду публиковать полный вывод (он большой), но я надеюсь, что это основные моменты:

Crypt_GPG DEBUG: STATUS: GET_HIDDEN passphrase.enter
Crypt_GPG DEBUG: STATUS: GOT_IT
Crypt_GPG DEBUG: STATUS: MISSING_PASSPHRASE
Crypt_GPG DEBUG: STATUS: BAD_PASSPHRASE EEE2DCBB741D9730
Crypt_GPG DEBUG: STATUS: USERID_HINT EEE2DCBB741D9730 Test Key (Test Key)
Crypt_GPG DEBUG: STATUS: NEED_PASSPHRASE EEE2DCBB741D9730 EEE2DCBB741D9730 17 0
Crypt_GPG DEBUG: STATUS: GET_HIDDEN passphrase.enter
Crypt_GPG DEBUG: => closing GPG input pipe
Crypt_GPG DEBUG: selecting streams
Crypt_GPG DEBUG: => got 1
Crypt_GPG DEBUG: GPG is ready for command data
Crypt_GPG DEBUG: => about to write 1 bytes to GPG command
Crypt_GPG DEBUG: => wrote 1
Crypt_GPG DEBUG: => closing GPG input pipe
Crypt_GPG DEBUG: selecting streams
Crypt_GPG DEBUG: => got 1
Crypt_GPG DEBUG: GPG status stream ready for reading
Crypt_GPG DEBUG: => about to read 8192 bytes from GPG status
Crypt_GPG DEBUG: => read 44 bytes
Crypt_GPG DEBUG: STATUS: GOT_IT
Crypt_GPG DEBUG: STATUS: MISSING_PASSPHRASE
Crypt_GPG DEBUG: => closing GPG input pipe
Crypt_GPG DEBUG: selecting streams
Crypt_GPG DEBUG: => got 1
Crypt_GPG DEBUG: GPG status stream ready for reading
Crypt_GPG DEBUG: => about to read 8192 bytes from GPG status
Crypt_GPG DEBUG: => read 122 bytes
Crypt_GPG DEBUG: STATUS: BAD_PASSPHRASE EEE2DCBB741D9730

а потом позже:

Crypt_GPG DEBUG: END PROCESSING
Crypt_GPG DEBUG: CLOSING SUBPROCESS
Crypt_GPG DEBUG: => subprocess returned an unexpected exit code: 2

Fatal error: Uncaught <table border="1" cellspacing="0"> <tr><td colspan="3" bgcolor="#ff9999"> <b>Crypt_GPG_BadPassphraseException</b>: Cannot sign data. Incorrect passphrase provided. in <b>/home/myserver/php/Crypt/GPG.php</b> on line <b>1054</b></td></tr> <tr><td colspan="3" bgcolor="#aaaaaa" align="center"><b>Exception trace</b></td></tr> <tr><td align="center" bgcolor="#cccccc" width="20"><b>#</b></td><td align="center" bgcolor="#cccccc"><b>Function</b></td><td align="center" bgcolor="#cccccc"><b>Location</b></td></tr> <tr><td align="center">0</td><td>Crypt_GPG->_sign('Hello, World!', false, null, 2, true)</td><td>/home/myserver/php/Crypt/GPG.php:1054</td></tr> <tr><td align="center">1</td><td>Crypt_GPG->sign('Hello, World!', 2)</td><td>/home/myserver/public_html/email.php:7</td></tr> <tr><td align="center">2</td><td>{main}</td><td>&nbsp;</td></tr> </table> thrown in /home/myserver/php/Crypt/GPG.php on line 1837

Мне кажется, что у Crypt_GPG возникают проблемы с выбором того, что ему нужно, из ключа GNUPG? Кажется, что ключ найден правильно, но он падает с кодовой фразой. Это ошибка моего понимания и кода, или это потому, что CPanel и Apache - разные пользователи или что-то в этом роде?

Нужен совет, спасибо ;)


person MrFidge    schedule 09.09.2009    source источник
comment
Попробуйте объявить другой Crypt_GPG вместо использования $gpg для очистки сообщения.   -  person Federico klez Culloca    schedule 09.09.2009


Ответы (1)


В примерах показано, как указать парольная фраза:

$gpg->addSignKey('[email protected]', 'test');

Дополнительные примеры см. в документации.

person Bombe    schedule 09.09.2009
comment
да, это было - я неправильно настроил парольную фразу! Теперь все работает. Спасибо, парни! - person MrFidge; 09.09.2009