4

私はcrypto/phpの質問があります、私は誰かが私を助けてくれることを望んでいました。私の問題は、PHPで検証しようとしている署名済みのPKCS7ブロックがあることです。ただし、次のPHPコマンドを実行すると次のようになります。

openssl_pkcs7_verify($myfile, PKCS7_BINARY | PKCS7_NOVERIFY, $signers_file);

次のエラーが発生します。

PKCS7 routines:SMIME_read_PKCS7:no content type

私がそのようにルビーを使ってそれをするならば:

p7container = OpenSSL::PKCS7.new(file_contents);
mystore = OpenSSL::X509::Store.new
p7container.verify(nil, store, nil, OpenSSL::PKCS7::NOVERIFY)

できます。

また、OpenSSLコマンドラインから実行した場合:

openssl smime -verify -inform der -in my_data_file -noverify

それも動作します。ただし、次のコマンドを実行すると、次のようになります。

openssl smime -verify -in my_data_file -noverify

これは同じコマンドですが、informパラメータを指定しないと、「コンテンツタイプがありません」に関して、前に指定したのと同じエラーメッセージで失敗し、入力ファイル形式を指定する必要があるように見えます。PHPを介してそれを行う方法はありますか?

よろしくお願いします。

4

1 に答える 1

2

PHPから直接opensslを呼び出すことで(exec関数を使用して)この問題を回避しました。「検証に成功しました」というメッセージがstderrに送信されるため、stderrをstdoutにリダイレクトするコマンドに2>&1を必ず追加してください。

function verify($signedData, &$data = null) {
    @mkdir("tmp");
    $random = randomString(32);
    $signedFile = "tmp/" . $random . ".pem";
    $file = "tmp/" . $random . ".dat";
    file_put_contents($signedFile, $signedData);
    $output = exec("openssl smime  -verify -in $signedFile -inform DER -noverify -out $file 2>&1");
    if ($output == "Verification successful") {
        $data = file_get_contents($file);
        $result = true;
    } else {
        $result = false;
    }
    @unlink($signedFile);
    @unlink($file);
    return $result;
}
于 2013-02-27T16:19:01.223 に答える