Como usar o GNUPG e CRYPT_GPG
-
22-09-2019 - |
Pergunta
Estou tentando usar o GNUPG e Crypt_gpg Criptografar dados prontos para serem enviados em e -mail para um servidor cliente, mas estou tendo problemas para configurá -los.
- Eu instalei o GNUPG no servidor e funciona muito bem, localizado em
/home/myserver/.gnupg
- Eu instalei Crypt_GPG em
/home/myserver/php/Crypt
e editou os vários arquivos para ter referências de link absoluto entre si. Eles funcionam bem. - Eu usei meu CPanel de servidor para criar uma chave pública/secreta de teste. A chave gerada bem.
Aqui está o meu código de teste (com o modo de depuração deixado)
<?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('info@test.co.uk'), "<br>";
echo "My key fingerprint is: ", $gpg->getFingerprint('info@test.co.uk', Crypt_GPG::FORMAT_CANONICAL), "<br>";
$data = 'Hello, World!';
$gpg->addSignKey('info@test.co.uk');
$signedData = $gpg->sign($data, Crypt_GPG::SIGN_MODE_CLEAR);
echo "<br><br>Clearsigned message is: ", $signedData, "\n";
?>
A primeira seção do código funciona bem - a chave pública é recuperada, exibida e a impressão digital também mostra.
O problema está no segundo bloco de código - realmente tentando criptografar alguma coisa. Recebo esses erros na saída de depuração. Não vou postar a saída completa (é grande), mas espero que esses sejam os pontos salientes:
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
E então depois:
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> </td></tr> </table> thrown in /home/myserver/php/Crypt/GPG.php on line 1837
Para mim, parece que o Crypt_GPG está tendo problemas para selecionar o que ele precisa na tecla GNUPG? Parece encontrar a chave corretamente, mas cai com a senha. Isso é um erro com meu entendimento e código, ou é porque o CPALEL e o Apache são usuários diferentes ou algo assim?
Precisa de um pouco de orientação, obrigado;)
Solução
o exemplos Mostre como especificar a senha:
$gpg->addSignKey('test@example.com', 'test');
Verificar a documentação Para mais exemplos.