XAMPPを実行しているPHPのWindowsプラットフォームでGPG暗号化を実行しようとしています。
WebサーバーはApacheであり、PHP5.2.9を実行しています。GPG4Win2.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()を使用し、ディスクI / Oを使用してコンテンツを提供し、出力を取得することは避けたいと思います。これはWebサーバーで実行されるため、proc_open()を使用すると、わざわざ一意のファイルを生成できなくなります。それらをクリーンアップする必要があります。