4

我有一个加密/php 问题,我希望有人可以帮助我。我的问题是我有一个签名的 PKCS7 块,我试图在 PHP 中验证它。但是,当我运行以下 PHP 命令时:

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

我收到以下错误:

PKCS7 routines:SMIME_read_PKCS7:no content type

如果我像这样使用 ruby​​ 进行操作:

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

这是相同的命令,但没有指定通知参数,它失败并出现之前指定的相同错误消息,关于“无内容类型”,这使得我似乎需要指定输入文件格式。有什么想法可以通过 PHP 做到这一点吗?

在此先感谢您的帮助,

4

1 回答 1

2

我通过直接从 PHP 调用 openssl(使用exec函数)解决了这个问题。确保在命令中添加 2>&1 以将 stderr 重定向到 stdout,因为消息“验证成功”被发送到 stderr。

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 回答