PHP OpenSSL openssl_pkcs7_verify () не работает, даже если openssl из оболочки работает - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь использовать встроенную в PHP библиотеку OpenSSL для получения содержимого файла с подписью p7m (файла XML, в частности, fattura elettronica для итальянцев).Мне не нужно проверять знак / сертификат, мне нужен только контент.

Я пытаюсь "перевести" это с помощью 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 () и т. д.
Я видел эту PHP-библиотеку OpenSSLнужен 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.
Как я могу исправитьтот?Заранее спасибо!

1 Ответ

0 голосов
/ 02 марта 2019

Хорошо, я решил это следующим образом:
Сначала я должен был извлечь сертификат подписавшего из файла с помощью

openssl_pkcs7_verify($input, PKCS7_NOVERIFY | PKCS7_NOSIGS, $signer);

Он извлекает сертификат и сохраняет его в $ signer.

Затем я использовал

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

для извлечения содержимого из подписанного файла в $ output с использованием сертификата подписавшего.
Конечно, мне все еще нужно было преобразовать ввод из DERSMIME, используя эту функцию (der2smime ()).
Надеюсь, это поможет!

...