Signatur
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
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;
}
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;
}
}
// 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.