openssl_pkcs7_verify

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

openssl_pkcs7_verifyVerifica la firma de un mensaje S/MIME firmado

Descripción

openssl_pkcs7_verify(
    string $filename,
    int $flags,
    string $outfilename = ?,
    array $cainfo = ?,
    string $extracerts = ?,
    string $content = ?
): mixed

openssl_pkcs7_verify() lee el mensaje S/MIME contenido en el archivo dado y examina la firma digital.

Parámetros

filename

Ruta del mensaje.

flags

flags se puede usar para indicar cómo se verifica la firma - véase constantes PKCS7 para más información.

outfilename

Si se especifica outfilename, debería se una cadena que contiene el nombre de un archivo en el que los certificados de las personas que firmaron los mensajes serán guardados en formato PEM.

cainfo

Si se especifica cainfo, debería contener información sobre los certificados de la AC de confianza para usarla en el proceso de verificación - véase verificación de certificados para más información acerca de este parámetro.

extracerts

Si se especifica extracerts, éste es el nombre de archivo de un archivo que contiene un grupo de certificados que se van a usar como AC que no sea de confianza.

content

Se puede especificar un nombre de archivo con content, que será rellenado con la información verificada, pero con la información de la firma eliminada.

Valores devueltos

Devuelve true si la firma es verificada, false si no es correcta (el mensaje ha sido interferido, o el certificado de firma no es válido), o -1 si se produjo un error.

Historial de cambios

Versión Descripción
5.1.0 Se añadió el parámetro content.

Notas

Nota: Como está especificado en RFC 2045, la líneas no pueden ser más largas de 76 caracteres en el parámetro filename.

add a note add a note

User Contributed Notes 2 notes

up
5
reg1barclay at REMOVETHIS dot live dot it
5 years ago
To verify a .p7m file with openssl_pkcs7_verify() you must convert it to S/MIME format. For example...
<?php
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);
}
?>
up
-2
Krzychu
10 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

Code:
  $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