- PR -

PHP+Perl+GnuPGで暗号化ファイルの出力

1
投稿者投稿内容
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-06-15 11:36
お世話になっております。

現在、PHPを中心としたWebシステムを構築しています。
まず、PHPでDBからデータを取得しCSVファイルを作り、
PerlでそのCSVファイルをGnuPGの共通鍵暗号化方式で暗号化します。
そのファイルを添付してメールを送信するのが一連の機能なのですが
問題となっているのは暗号化した結果のファイルが出力されていないことです。
ですが、なぜかコマンドラインから動かした場合はファイルが出力されています。

なぜコマンドラインからの実行ではうまくいくのに、Webからだとうまく動かないのでしょうか?
Webからうまく実行させるには、何か特別なことが必要なのでしょうか?

以下、コード

・PHPのコード抜粋
コード:

// コマンド生成
$sCmd = $sPlScript . " "; // Perlのプログラム名
$sCmd .= $sToAddress . " "; // 送信先メールアドレス
$sCmd .= $sHeaderName . " "; // メールヘッダファイル名
$sCmd .= $sSignatureName; // シグネチャファイル名

// コマンド実行
$sRtnVal = system( $sCmd );




・Perlスクリプトの抜粋
 その1とその2の両方を試してみましたが、どちらも結果は一緒でした。
 また、出力ファイル名を指定しない場合も同様の結果となりました。
コード:

#コードが長いので便宜上折り返しています。

### その1
open ENCRYPT, "| /gpgのパス/gpg -c --passphrase-fd 0
         --cipher-algo aes --batch --no-tty
         --output 出力ファイル名 CSVファイル名";
print ENCRYPT "パスフレーズ\n\n";
close ENCRYPT;

### その2
`echo パスフレーズ | /gpgへのパス/gpg -c --passphrase-fd 0
          --cipher-algo aes --batch --no-tty
          --output 出力ファイル名 CSVファイル名`;



以下、環境です。

OS  : SunOS5.8
Apache: 1.3.27_2.8.14-BG7
PHP  : 4.3.4
Perl : 5.6.1
GnuPG : 1.0.7

PHPはCGIモードで動いています。

パーミッションの問題かと思い、Perlのほうで出力先ディレクトリでtouchして
空ファイルを生成してみたところ、作られていたので違うかなと思います。

以上です。よろしくお願いします。

#誤字修正
#コードが長いので折り返しました。
[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 11:52 ]

[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 17:01 ]
MERCY
常連さん
会議室デビュー日: 2003/12/16
投稿数: 24
投稿日時: 2004-06-15 12:05
えーと、どこが問題なんでしょう?

GnuPGって使ったこと無いので、その使い方はわからないのですが

PHPをコマンドラインから動かせばちゃんと動くのですか?
Perlのスクリプトは正常な引数を指定して実行した場合期待通りに動きますか?
PHPからそのPerlが実行されていますか?
WEBからファイル作るなら、ディレクトリのアクセス権は大丈夫ですか?
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-06-15 13:07
MERCYさん返信有難うございます。

引用:

MERCYさんの書き込み (2004-06-15 12:05) より:
えーと、どこが問題なんでしょう?

GnuPGって使ったこと無いので、その使い方はわからないのですが

1.PHPをコマンドラインから動かせばちゃんと動くのですか?
2.Perlのスクリプトは正常な引数を指定して実行した場合期待通りに動きますか?
3.PHPからそのPerlが実行されていますか?
4.WEBからファイル作るなら、ディレクトリのアクセス権は大丈夫ですか?



勝手にご質問に番号をつけさせていただきました。

1.コマンドラインから実行させた場合、こちらの意図した動きをします。

2.期待通りの動きをします。
  PHPからの引数の渡し方などが問題なのかも勿論疑いましたが
  実際に発行しているコマンドをログに落としておき、それをコマンドラインから
  発行しましたが、Perlのプログラムは問題なく動きました。

3.1と同じ回答になりますが問題なく動きます。

4.Webから実行するとき、暗号化済みファイルが出力されるディレクトリでPerlのプログラムから

   `touch hoge`;

  としてみたところ、空ファイルが作成されていました。なので、アクセス権限の
  問題ではないと思うのですが、もしかして見当違いのことを言っているのでしょうか?

結局、問題なのは、なぜコマンドラインからGnuPGの暗号化ファイルは正しく出力されるのに、
Webから実行した場合は出力されないのかということです。
また、解決に際し何らかの情報をどなたかお持ちではないかと思い投稿した次第です。

以上です。よろしくお願い致します。

#文言を編集&情報追加

[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 13:16 ]
MERCY
常連さん
会議室デビュー日: 2003/12/16
投稿数: 24
投稿日時: 2004-06-15 13:41
その状態なら、GnuPGの実行権が無いんじゃないでしょうか?

というか、コマンドラインからPHP ?????.phpで動くなら
後はパーミッションの問題位しかないかと・・・・・・

特にWebだから、と言う問題はないはずです。
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-06-15 14:18
返信有難うございます。

引用:

MERCYさんの書き込み (2004-06-15 13:41) より:
その状態なら、GnuPGの実行権が無いんじゃないでしょうか?

というか、コマンドラインからPHP ?????.phpで動くなら
後はパーミッションの問題位しかないかと・・・・・・

特にWebだから、と言う問題はないはずです。



すいませんでした。GnuPGの実行権に関して記述するのをすっかりわすれていました。
ディレクトリのアクセス権限のことばかり気にしてました…。

それで、GnuPGの実行件に関しても既に調べてありまして
555となっています。なので、実行件に関しても問題はないと思っています。

実際には、/usr/…/bin/gpgというシンボリック・リンクを通じて実行しています。
ちなみに、このシンボリックリンクのアクセス権限は777です。

私もWebだからどうこうという問題ではないと思っているのですが
私が調べられるところは調べてしまったので、八方塞がり状態です。
Apacheのログにも特に怪しいエラーはでていませんし…。
GnuPGの問題ということもあるのでしょうか…。

#自動更新にしておいたのを忘れてて書いたのが全部一回消えた…
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-06-15 15:09
お世話になっております。

続報です。
apacheのログを調べていて怪しいエラーが見つかりました。
#どうも私が調べていたのは違うログだったようです…

gpg: fatal: ~/.gnupg: can't create directory: No such file or directory
secmem usage: 0/0 bytes in 0/0 blocks of pool 0/16384

ここここ同じ問題のものがありました。

まだ、ざっとしか読んでいないのですが、セキュリティに関する問題のようです。
root以外で動かした場合にメモリのロック?が出来なくてエラーになっているとか
そんなことのようです。

GnuPGの設定に問題がありそうなので、もう一度見直してみて
進展しましたら再度書き込みます。

以上です。

#リンク先追加

[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 15:34 ]

[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 15:48 ]
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-06-15 16:56
お世話になっております。

結果報告です。
結論から申し上げますと、Webからでもうまく暗号化することが出来ました。
問題となっていたのはこちらのスレッドでも議論されていますが、
apacheを動かしているユーザーといえばいいのでしょうか? そのユーザーのディレクトリに
.gnupgというディレクトリと設定ファイルを作ろうとしてエラーとなっているようです。
恐らく、/home配下のユーザーディレクトリに作成しようとしたけれど、~/に対応するディレクトリがなくてエラーになったのでしょう。

そこで、gpgのオプションで --homedirを追加してあげて、適切なディレクトリを指定してあげることで正常に動作しました。

コード:

#コードが長いので便宜上折り返して記述してあります。
open ENCRYPT, "| /gpgのパス/gpg -c --homedir ホームディレクトリ
         --passphrase-fd 0 --cipher-algo aes --batch --no-tty
         --output 出力ファイル名 CSVファイル名";
print ENCRYPT "パスフレーズ\n\n";
close ENCRYPT;



上のスクリプトで正常動作を確認しました。
MERCYさん、お忙しいところお付き合いありがとうございました。

以上です。

[ メッセージ編集済み 編集者: ゆう 編集日時 2004-06-15 17:03 ]
1

スキルアップ/キャリアアップ(JOB@IT)