Start · Sprachen · PHP · Referenz · openssl_cms_read

openssl_cms_read

Funktion

Liest eine CMS-Datei und exportiert die darin enthaltenen Zertifikate als Array von PEM-kodierten Zeichenketten.

seit PHP 8.1.0 Kategorie: crypto

Signatur

openssl_cms_read(string $input_filename, array &$certificates, int $encoding = OPENSSL_ENCODING_SMIME): bool

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

Typ
bool
Beschreibung
Gibt 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;
}
Gefundene Zertifikate: 1 --- Zertifikat #0 --- -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE-----

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;
}
Betreff: Max Mustermann Aussteller: Example CA Gültig bis: 2025-12-31

// 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.