LaravelConf Taiwan 2020 CFP Started


(PHP 4 >= 4.0.6, PHP 5, PHP 7)

openssl_pkcs7_verifyПроверить подпись сообщения S/MIME


openssl_pkcs7_verify ( string $filename , int $flags [, string $outfilename [, array $cainfo [, string $extracerts [, string $content [, string $p7bfilename ]]]]] ) : mixed

openssl_pkcs7_verify() читает S/MIME сообщение из файла и проверяет его подпись.

Список параметров


Путь к файлу с сообщением.


flags можно использовать для модификации процесса проверки. Более подробно см. константы PKCS7.


Если задан параметр outfilename, то в нем должна быть строка с именем файла, в который будут сохранены сертификаты, использованные при подписании, в формате PEM.


Если задан параметр cainfo, то в нем должна содержаться информация о доверенных сертификатах CA, которые необходимо использовать в процессе проверки. Более подробно читайте на странице проверки сертификатов.


Если задан параметр extracerts, в нем должно содержаться имя файла, содержащего набор недоверенных сертификатов CA.


В параметре content можно указать имя файла, в который будут записаны верифицированные данные без информации о подписи.


Возвращаемые значения

Возвращает TRUE, если проверка успешна, FALSE, если нет и -1 в случае ошибки.

Список изменений

Версия Описание
7.2.0 Добавлен параметр p7bfilename.
5.1.0 Добавлен параметр content.


Замечание: Как указано в RFC 2045, длина параметра filename не должна быть длинее 76 символов.

add a note add a note

User Contributed Notes 2 notes

reg1barclay at REMOVETHIS dot live dot it
1 year ago
To verify a .p7m file with openssl_pkcs7_verify() you must convert it to S/MIME format. For example...
function der2smime($file)
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
6 years ago
To read signed message in base64 (not encrypted with priv&pub key):

You can just decode content by "base64_decode" or "imap_base64" functions and then erase by hand(regexp) sign from bottom of mail. Unfortunately  in my case (mail from Outlook) that  message (decoded by "base64_decode") has some additional special chars in some places (ie. before every attachment encoded base_64) what make message e-mail unable to parse.

After couple of hours I solved this:
It's needed to save single e-mail and use 2x "openssl_pkcs7_verify" function in row on original email (with headers and content in base64 ):
  1st use - extract sign (certificate) from e-mail and save to file *.cert
  2nd use - extract (with use that *.cert file) decoded message to  file*.out

  $handle  =  imap_open('mailbox.eml', '', '');

  $msg = 'home/john/tmp/email1.eml';
  imap_savebody($handle, $msg,  1);

  openssl_pkcs7_verify($msg, 0, $msg . '.cert');
  openssl_pkcs7_verify($msg, 0, $msg . '.cert', array(), $msg . '.cert', $msg.'.out');

  $email_content = file_get_contents($msg . '.out');
To Top