Start · Sprachen · PHP · Referenz · openssl_x509_parse

openssl_x509_parse

Funktion

Parst ein X.509-Zertifikat und gibt alle enthaltenen Informationen (Aussteller, Gültigkeit, Subject, Erweiterungen usw.) als assoziatives Array zurück.

seit PHP 4.0.6 Kategorie: crypto

Signatur

openssl_x509_parse(OpenSSLCertificate|string $certificate, bool $short_names = true): array|false

Beschreibung

openssl_x509_parse() liest ein X.509-Zertifikat und extrahiert sämtliche darin enthaltenen Metadaten als strukturiertes PHP-Array. Das ist nützlich, wenn man Zertifikatsinformationen programmatisch auswerten möchte, z. B. um Ablaufdaten zu prüfen, den Aussteller zu verifizieren oder den Verwendungszweck (Key Usage, Extended Key Usage) eines Zertifikats zu analysieren.

Das zurückgegebene Array enthält unter anderem die Felder subject, issuer, validFrom_time_t, validTo_time_t, serialNumber, extensions und weitere. Die Zeitangaben validFrom_time_t und validTo_time_t sind Unix-Timestamps und lassen sich direkt mit time() oder date() verarbeiten.

Der Parameter short_names steuert, ob die Felder-Schlüssel in Kurzform (z. B. CN, O, C) oder als vollständige Bezeichnungen (z. B. commonName, organizationName) zurückgegeben werden. Die Kurzform entspricht den gängigen OpenSSL-Bezeichnungen und ist der Standard.

Die Funktion akzeptiert das Zertifikat entweder als OpenSSLCertificate-Objekt (PHP 8.0+), als PEM-kodierten String oder als Dateipfad in der Form file://pfad/zum/zertifikat.pem.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das zu parsende X.509-Zertifikat. Kann ein OpenSSLCertificate-Objekt (ab PHP 8.0), ein PEM-kodierter String oder ein Dateipfad in der Form file:///pfad/zum/cert.pem sein.
$short_names bool true Gibt an, ob die Feldnamen im zurückgegebenen Array als Kurzbezeichnungen (z. B. CN, O) oder als vollständige Namen (z. B. commonName, organizationName) erscheinen sollen. Standard ist true (Kurzbezeichnungen).

Rückgabewert

Typ
array|false
Beschreibung
Gibt bei Erfolg ein assoziatives Array mit den Zertifikatsinformationen zurück. Schlägt das Parsen fehl (ungültiges Zertifikat, Datei nicht gefunden usw.), wird false zurückgegeben.

Beispiele

Ablaufdatum eines Zertifikats prüfen

<?php
// PEM-Zertifikat aus einer Datei laden
$pem = file_get_contents('/etc/ssl/certs/example.pem');

$data = openssl_x509_parse($pem);

if ($data === false) {
    echo 'Zertifikat konnte nicht geparst werden.';
    exit(1);
}

$validTo   = $data['validTo_time_t'];
$daysLeft  = (int)(($validTo - time()) / 86400);

echo 'Betreff (CN): ' . ($data['subject']['CN'] ?? 'unbekannt') . PHP_EOL;
echo 'Aussteller:   ' . ($data['issuer']['CN']  ?? 'unbekannt') . PHP_EOL;
echo 'Gültig bis:   ' . date('d.m.Y', $validTo) . PHP_EOL;
echo 'Noch gültig:  ' . $daysLeft . ' Tage' . PHP_EOL;

if ($daysLeft < 30) {
    echo 'WARNUNG: Zertifikat läuft in weniger als 30 Tagen ab!' . PHP_EOL;
}
Betreff (CN): example.com Aussteller: Let's Encrypt Authority X3 Gültig bis: 15.08.2025 Noch gültig: 47 Tage

Alle Felder mit langen Bezeichnungen ausgeben

<?php
// Zertifikat über openssl_x509_read laden (PHP 8.0+: gibt OpenSSLCertificate zurück)
$cert = openssl_x509_read(file_get_contents('/etc/ssl/certs/example.pem'));

if ($cert === false) {
    die('Zertifikat ungültig.');
}

// short_names = false => vollständige Feldnamen
$data = openssl_x509_parse($cert, false);

echo 'Common Name:       ' . ($data['subject']['commonName']       ?? '-') . PHP_EOL;
echo 'Organisation:      ' . ($data['subject']['organizationName'] ?? '-') . PHP_EOL;
echo 'Seriennummer:      ' . $data['serialNumber'] . PHP_EOL;
echo 'SHA-1 Fingerprint: ' . $data['hash'] . PHP_EOL;

// Erweiterungen ausgeben
if (!empty($data['extensions'])) {
    echo PHP_EOL . 'Zertifikat-Erweiterungen:' . PHP_EOL;
    foreach ($data['extensions'] as $name => $value) {
        echo '  ' . $name . ': ' . (is_array($value) ? implode(', ', $value) : $value) . PHP_EOL;
    }
}
Common Name: example.com Organisation: Example GmbH Seriennummer: 03A1B2C3D4E5F6 SHA-1 Fingerprint: ab12cd34ef56... Zertifikat-Erweiterungen: subjectAltName: DNS:example.com, DNS:www.example.com keyUsage: Digital Signature, Key Encipherment extendedKeyUsage: TLS Web Server Authentication

// Wichtig · Fallstricke

Sicherheitshinweis: openssl_x509_parse() analysiert nur die Inhalte eines Zertifikats, führt aber keine kryptografische Signaturprüfung oder Kettenvalidierung durch. Um sicherzustellen, dass ein Zertifikat vertrauenswürdig ist, muss zusätzlich openssl_x509_verify() bzw. eine vollständige Kettenprüfung über openssl_x509_checkpurpose() durchgeführt werden.

Das Feld extensions im Rückgabe-Array enthält X.509v3-Erweiterungen wie subjectAltName, keyUsage oder basicConstraints als String oder Array, je nach Erweiterungstyp.

Ab PHP 8.0 werden OpenSSL-Ressourcen durch das OpenSSLCertificate-Objekt ersetzt. Ältere Code-Pfade, die resource-Typen erwarten, sollten entsprechend angepasst werden.