As someone already mentioned in the previous comment it didn't work for me until I passed in that hidden sixth argument and also explicitly add the mime header into the $in_filename contents. (I am using PHP5)
$data = file_get_contents($in_filename);
file_put_contents($in_filename, "MIME-Version: 1.0\nContent-Disposition: attachment; filename=\"smime.p7m\"\nContent-Type: app
lication/x-pkcs7-mime; name=\"smime.p7m\"\nContent-Transfer-Encoding: base64\n\n$data");
openssl_pkcs7_verify("$in_filename",
$flag,
"$out_filename.cert",
array($path_to_cert),
$path_to_cert,
$out_filename));
openssl_pkcs7_verify
(PHP 4 >= 4.0.6, PHP 5)
openssl_pkcs7_verify — Überprüft die Unterschrift einer mit S/MIME unterschriebenen Nachricht
Beschreibung
Die Funktion openssl_pkcs7_verify() liest die S/MIME Nachricht, die in der Datei filename enthalten ist und untersucht die digitale Unterschrift. Ist die Unterschrift überprüft wird TRUE zurückgegeben, falls die Unterschrift nicht korrekt ist FALSE (die Nachricht wurde mit dem Zertifikat vermischt oder das unterzeichnende Zertifikat ist ungültig). Tritt ein Fehler auf wird -1 zurückgegeben.
Mit dem Parameter flags könnenn Sie die Art und Weise beeinflussen, wie die Unterschrift überprüft wird - für mehr Informationen siehe PKCS7 Konstanten.
Wird der Parameter outfilename angegeben, sollte dies eine Zeichenkette sein, die den Namen einer Datei enthält, in der das Zertifikat der unterzeichnenden Person im PEM Format gespeichert wird.
Wird der Parameter cainfo angegeben, sollten Informationen über die vertrauenswürdigen CA Zertifikate enthalten sein, die für den Überprüfungsprozess benutzt werden - für mehr Informationen zu diesem Parameter sollten Sie unter Zertifikat Nachweis nachschauen.
Wird der Parameter extracerts angegeben, ist es der Name einer Datei, die ein mehrere extra Zertifikate enthält, die als nicht vertrauenswürdige CAs genutzt werden.
openssl_pkcs7_verify
29-Sep-2006 02:39
There is a hidden sixth argument: string pointing to a file where the contents of the signed message should be saved.
It is very important for verifying signed and encrypted messages from MS Outlook which uses opaque signing. After decrypting of message you will get another MIME envelope like this:
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
MIIM/QYJ...
Even if you use base64_decode() you will not get decrypted message but PKCS #7 object.
BTW: How to create opaque signed message like from MS Outlook? Switch off PKCS7_DETACHED flag (the last 0 does it):
openssl_pkcs7_sign(
"full_path_to_message_file",
"full_path_where_to_store_signed_message_file",
"file://full_path_to_my_public_certificate.pem",
array("file://full_path_to_my_private_key.pem", "password"),
array(),
0
);
