Я пытаюсь выполнить шифрование GPG на платформе Windows, в PHP, используя XAMPP.
Веб-сервер Apache и работает на PHP 5.2.9.
Я использую GPG4Win 2.0.4.
Я успешно выполнил команду encrypt из командной строки. Я изменил имена получателей и хостов.
C:\>C:\PROGRA~1\GNU\GnuPG\pub\gpg.exe --encrypt --homedir C:\DOCUME~1\reubenh.AD\APPLIC~1\gnupg --recipient name@host.com --armor < test.txt > test.enc.txt
В PHP я использую proc_open (), чтобы я мог передать содержимое, которое должно быть зашифровано, непосредственно процессу и использовать канал stdout для получения вывода.
Ниже приведен фрагмент кода:
$cmd = Configure::read('Legacy.GPG.gpg_bin').' --encrypt '.
'--homedir '.Configure::read('Legacy.GPG.gpg_home').' '.
'--recipient '.Configure::read('Legacy.MO.gnugp_keyname').' '.
'--local-user '.'me@host.com'.' '.
'--armor --no-tty --batch --debug-all';
error_log('Encrypting Command line is '.$cmd);
$descriptors = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('file', LOGS.'gpg.log', 'a')
);
$process = proc_open($cmd, $descriptors, $pipes);
if (is_resource($process)) {
error_log(print_r($pipes, true));
list($stdin, $stdout) = $pipes;
error_log('Have pipes');
error_log('body length is '.strlen($this->request['body']));
$ret = fwrite($stdin, $this->request['body'], strlen($this->request['body']));
error_log($ret.' written');
error_log('before fclose()');
fclose($stdin);
error_log('Done with input');
$encryptedData = '';
while(!feof($stdout)) {
$line = fgets($stdout);
error_log('Line read:'.error_log(print_r($line, true)));
$encryptedData .= $line;
}
fclose($stdout);
$return = proc_close($process);
error_log('Encryption process returned '.print_r($return, true));
if ($return == '0') { // ... next step is to sign
Сгенерированная команда из первого оператора error_log ():
C:\PROGRA~1\GNU\GnuPG\pub\gpg.exe --encrypt --homedir C:\DOCUME~1\reubenh.AD\APPLIC~1\gnupg --recipient name@host.com --local-user me@host.com --armor --no-tty --batch --debug-all
Кажется, что фактический пробег достигает "Иметь трубы". После этого он просто останавливается.
Я также вижу в Process Explorer, что gpg.exe также порождает gpg2.exe. Я подозреваю, что именно этот gpg2.exe у меня нет дескриптора, ждет ввода, а не исходный gpg.exe, который я вызвал.
Я пытался вызвать gpg2.exe напрямую, но дочерний gpg2.exe все еще создается.
Я бы предпочел использовать proc_open () и избегать использования дискового ввода-вывода для предоставления содержимого и получения выходных данных, поскольку это будет выполняться на веб-сервере, а proc_open () позволит мне не беспокоиться о создании уникальных файлов и затем нужно их почистить.