Start · Sprachen · PHP · Referenz · OpenSSLCertificate

OpenSSLCertificate

Klasse

Vollständig opake Klasse, die OpenSSL-X.509-Zertifikatsressourcen ab PHP 8.0.0 als typsicheres Objekt kapselt.

seit PHP 8.0.0 Kategorie: crypto

Signatur

class OpenSSLCertificate

Beschreibung

OpenSSLCertificate ist eine interne, vollständig opake PHP-Klasse, die ein geladenes X.509-Zertifikat repräsentiert. Vor PHP 8.0 wurden solche Zertifikate als resource vom Typ OpenSSL X.509 behandelt; seit PHP 8.0 gibt die Funktion openssl_x509_read() statt einer Ressource ein Objekt dieses Typs zurück.

Da die Klasse vollständig opak ist, lassen sich ihre internen Daten nicht direkt als Objekteigenschaften auslesen. Der Zugriff auf Zertifikatsinformationen erfolgt ausschließlich über die zugehörigen openssl_x509_*-Funktionen, zum Beispiel openssl_x509_parse(), openssl_x509_check_private_key() oder openssl_x509_export().

Typische Einsatzbereiche sind die Überprüfung von TLS/SSL-Zertifikaten, das Auslesen von Zertifikatsfeldern (Aussteller, Gültigkeitszeitraum, Subject), das Exportieren von Zertifikaten in das PEM-Format sowie die Validierung von Zertifikatsketten. Durch die Objektorientierung lässt sich OpenSSLCertificate sauber in Typdeklarationen einsetzen.

Instanzen werden nie direkt mit new erzeugt, sondern ausschließlich als Rückgabewert von openssl_x509_read() oder anderen OpenSSL-Funktionen (z. B. openssl_csr_sign()) erhalten. Das manuelle Freigeben via openssl_x509_free() ist seit PHP 8.0 nicht mehr notwendig, da der Garbage Collector die Ressource automatisch verwaltet.

Beispiele

X.509-Zertifikat laden und Informationen auslesen

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

// openssl_x509_read() gibt ein OpenSSLCertificate-Objekt zurück
$cert = openssl_x509_read($pem);

if ($cert instanceof OpenSSLCertificate) {
    $info = openssl_x509_parse($cert);
    echo 'Subject CN : ' . ($info['subject']['CN'] ?? 'n/a') . PHP_EOL;
    echo 'Issuer     : ' . ($info['issuer']['O']  ?? 'n/a') . PHP_EOL;
    echo 'Gültig bis : ' . date('Y-m-d', $info['validTo_time_t']) . PHP_EOL;
} else {
    echo 'Zertifikat konnte nicht geladen werden.' . PHP_EOL;
}
Subject CN : example.com Issuer : Let's Encrypt Gültig bis : 2025-09-01

Zertifikat mit privatem Schlüssel prüfen und als PEM exportieren

<?php
$certPem = file_get_contents('/etc/ssl/certs/server.crt');
$keyPem  = file_get_contents('/etc/ssl/private/server.key');

$cert = openssl_x509_read($certPem);
$key  = openssl_pkey_get_private($keyPem);

if ($cert instanceof OpenSSLCertificate && $key instanceof OpenSSLAsymmetricKey) {
    if (openssl_x509_check_private_key($cert, $key)) {
        echo 'Zertifikat und privater Schlüssel passen zusammen.' . PHP_EOL;

        // Zertifikat als PEM-String exportieren
        openssl_x509_export($cert, $exported);
        file_put_contents('/tmp/exported.pem', $exported);
        echo 'Exportiert nach /tmp/exported.pem' . PHP_EOL;
    } else {
        echo 'Schlüsselpaar stimmt NICHT überein!' . PHP_EOL;
    }
}
Zertifikat und privater Schlüssel passen zusammen. Exportiert nach /tmp/exported.pem

// Wichtig · Fallstricke

Migration von PHP 7: Code, der auf den Typ resource prüft (z. B. is_resource($cert)), muss auf $cert instanceof OpenSSLCertificate umgestellt werden. Rückwärtskompatibilitäts-Shims sind nicht vorgesehen.

Manuelle Freigabe entfällt: openssl_x509_free() existiert in PHP 8.0+ zwar noch als Alias, ist aber ein No-Op und sollte im neuen Code weggelassen werden.

Keine Instantiierung via new: Da die Klasse vollständig opak ist, löst der Versuch, sie direkt zu instanziieren, einen Fehler aus. Instanzen kommen ausschließlich aus OpenSSL-Fabrikfunktionen.

Typdeklarationen: OpenSSLCertificate kann als Parameter- und Rückgabetyp verwendet werden, was die Typsicherheit bei der Arbeit mit Zertifikaten deutlich verbessert.