PHP OpenSSL openssl_pkcs7_verify() 不工作,即使来自 shell 的 openssl 工作

PHP OpenSSL openssl_pkcs7_verify() not working, even if openssl from shell works

我正在尝试使用 PHP 库中内置的 OpenSSL 来获取 p7m 签名文件的内容(XML 文件,尤其是意大利人的 fattura elettronica)。我不需要检查 sign/certificate,我只需要内容。

我正在尝试 "translate" 使用 openssl_pkcs7_verify():

openssl smime -verify -noverify -in file.xml.p7m -inform DER -out file.xml

这是执行此操作的 PHP 行:

$result = openssl_pkcs7_verify('file.xml.p7m', PKCS7_NOVERIFY, 'file.xml');

问题是 $result 是 -1 而 openssl_error_string() 给我这个错误:

error:0B065068:x509 certificate routines:BY_FILE_CTRL:loading defaults

不,我不能使用 exec() 或 shell_exec() 等
我看到 OpenSSL PHP 库需要 S/MIME 而不是 DER 所以我找到了这个函数来获取文件 S/MIME:

function der2smime($file) {
$to=<<<TXT
MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Type: application/x-pkcs7-mime; smime-type=signed-data;name="smime.p7m"
Content-Transfer-Encoding: base64
\n
TXT;
    $from=file_get_contents($file);
    $to.=chunk_split(base64_encode($from));
    return file_put_contents($file,$to);
}

但是在使用 openssl 之前使用它是行不通的。
我该如何解决?提前致谢!

好的,我已经这样解决了:
首先,我必须使用

从文件中提取签名者的证书
openssl_pkcs7_verify($input, PKCS7_NOVERIFY | PKCS7_NOSIGS, $signer);

它提取证书并将其保存在 $signer 中。

那我用过

openssl_pkcs7_verify($input, PKCS7_NOVERIFY | PKCS7_NOSIGS, $signer, [], $signer, $output);

使用签名者的证书从 $output 中的签名文件中提取内容。
当然,我仍然需要使用该函数 (der2smime()) 将输入从 DER 转换为 SMIME。
希望对您有所帮助!