Signatur
Beschreibung
openssl_cms_read() öffnet eine CMS-Datei (Cryptographic Message Syntax, RFC 5652) und extrahiert alle darin enthaltenen X.509-Zertifikate. Die gefundenen Zertifikate werden als PEM-kodierte Zeichenketten in das übergebene Array geschrieben. Diese Funktion ist nützlich, wenn man die Signaturfähigkeiten einer CMS-Nachricht analysieren oder die beteiligten Zertifikate prüfen möchte, ohne die Nachricht tatsächlich zu verifizieren.
CMS ist der Nachfolger von PKCS#7 und wird häufig in S/MIME-E-Mails, signierten Dokumenten und verschlüsselter Kommunikation eingesetzt. Die Funktion unterstützt verschiedene Kodierungsformate: S/MIME (OPENSSL_ENCODING_SMIME), binäres DER (OPENSSL_ENCODING_DER) und PEM (OPENSSL_ENCODING_PEM).
Im Unterschied zur vollständigen Verifikation mit openssl_cms_verify() prüft openssl_cms_read() keine Signaturen und validiert keine Vertrauensketten – sie dient rein der Extraktion der Zertifikatsdaten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $input_filename Pflicht | string | Pfad zur CMS-Datei, die gelesen werden soll. Die Datei muss im angegebenen Format ($encoding) vorliegen. |
|
| $certificates Pflicht | array | Referenz auf ein Array, das nach dem Aufruf die extrahierten Zertifikate als PEM-kodierte Zeichenketten enthält. Vorhandene Inhalte werden überschrieben. | |
| $encoding | int | OPENSSL_ENCODING_SMIME | Kodierungsformat der Eingabedatei. Mögliche Werte: OPENSSL_ENCODING_SMIME (Standard), OPENSSL_ENCODING_DER oder OPENSSL_ENCODING_PEM. |
Rückgabewert
true zurück, wenn die Datei erfolgreich gelesen und die Zertifikate extrahiert werden konnten. Bei einem Fehler (z. B. Datei nicht gefunden, ungültiges Format) wird false zurückgegeben.Beispiele
Zertifikate aus einer S/MIME-Datei extrahieren
<?php
$cmsFile = '/pfad/zur/nachricht.eml'; // S/MIME-formatierte CMS-Datei
$certificates = [];
if (openssl_cms_read($cmsFile, $certificates, OPENSSL_ENCODING_SMIME)) {
echo 'Gefundene Zertifikate: ' . count($certificates) . PHP_EOL;
foreach ($certificates as $index => $pem) {
echo "--- Zertifikat #{$index} ---" . PHP_EOL;
echo $pem . PHP_EOL;
}
} else {
echo 'Fehler beim Lesen der CMS-Datei.' . PHP_EOL;
$errors = [];
while ($error = openssl_error_string()) {
$errors[] = $error;
}
echo implode(PHP_EOL, $errors) . PHP_EOL;
}
Zertifikat aus PEM-kodierter CMS-Datei lesen und Aussteller anzeigen
<?php
$cmsFile = '/pfad/zur/nachricht.pem';
$certificates = [];
if (openssl_cms_read($cmsFile, $certificates, OPENSSL_ENCODING_PEM)) {
foreach ($certificates as $pem) {
$certResource = openssl_x509_read($pem);
if ($certResource !== false) {
$certInfo = openssl_x509_parse($certResource);
echo 'Betreff: ' . ($certInfo['subject']['CN'] ?? 'unbekannt') . PHP_EOL;
echo 'Aussteller: ' . ($certInfo['issuer']['CN'] ?? 'unbekannt') . PHP_EOL;
echo 'Gültig bis: ' . date('Y-m-d', $certInfo['validTo_time_t']) . PHP_EOL;
}
}
} else {
echo 'Fehler: CMS-Datei konnte nicht gelesen werden.' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: openssl_cms_read() verifiziert weder Signaturen noch Vertrauensketten. Die extrahierten Zertifikate sollten daher für sicherheitskritische Zwecke immer mit openssl_cms_verify() oder einer eigenen Vertrauenskettenprüfung validiert werden, bevor auf ihre Inhalte vertraut wird.
Die Funktion steht erst ab PHP 8.1.0 zur Verfügung. Bei älteren PHP-Versionen sollte stattdessen openssl_pkcs7_read() für ähnliche PKCS#7/S/MIME-Dateien verwendet werden, da CMS rückwärtskompatibel zu PKCS#7 ist.
Auftretende OpenSSL-Fehler können über openssl_error_string() in einer Schleife abgefragt werden, um detaillierte Fehlermeldungen zu erhalten.