Start · Sprachen · PHP · Referenz · openssl_x509_read

openssl_x509_read

Funktion

Parst ein X.509-Zertifikat aus einem String oder einer Ressource und gibt ein <code>OpenSSLCertificate</code>-Objekt zurück.

seit PHP 4.0.6 Kategorie: crypto

Signatur

openssl_x509_read(OpenSSLCertificate|string $certificate): OpenSSLCertificate|false

Beschreibung

openssl_x509_read() nimmt ein X.509-Zertifikat entgegen – entweder als PEM-kodierten String, als Dateipfad (mit dem Präfix file://) oder als bereits vorhandenes OpenSSLCertificate-Objekt – und gibt ein geparsters Zertifikatobjekt zurück, das in weiteren OpenSSL-Funktionen verwendet werden kann.

Das zurückgegebene Objekt kann beispielsweise an openssl_x509_parse() übergeben werden, um Zertifikatsdetails wie Aussteller, Gültigkeitszeitraum oder Fingerabdruck auszulesen. Auch Operationen wie die Verifikation mit openssl_x509_verify() oder das Exportieren mit openssl_x509_export() erwarten dieses Objekt.

Ab PHP 8.0 gibt die Funktion ein OpenSSLCertificate-Objekt zurück; in früheren PHP-Versionen wurde eine interne Ressource (resource) zurückgegeben. Durch die Einführung des Objekttyps ist eine explizite Freigabe mit openssl_x509_free() nicht mehr notwendig – der Garbage Collector übernimmt dies automatisch.

Schlägt das Parsen fehl – etwa weil das übergebene Zertifikat kein gültiges PEM-Format hat – gibt die Funktion false zurück. Fehlerdetails lassen sich über openssl_error_string() abfragen.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das zu parsende X.509-Zertifikat. Akzeptiert: einen PEM-kodierten String, einen Dateipfad mit dem Präfix file:// oder ein bereits vorhandenes OpenSSLCertificate-Objekt (in diesem Fall wird es direkt zurückgegeben).

Rückgabewert

Typ
OpenSSLCertificate|false
Beschreibung
Gibt bei Erfolg ein OpenSSLCertificate-Objekt zurück (vor PHP 8.0 eine interne Ressource). Bei ungültigem oder nicht parsbarem Zertifikat wird false zurückgegeben.

Beispiele

Zertifikat aus PEM-String lesen und Details ausgeben

<?php
$pem = file_get_contents('/etc/ssl/certs/example.pem');

$cert = openssl_x509_read($pem);

if ($cert === false) {
    echo 'Zertifikat konnte nicht gelesen werden: ' . openssl_error_string();
    exit;
}

$info = openssl_x509_parse($cert);

echo 'Subject:    ' . $info['subject']['CN'] . PHP_EOL;
echo 'Aussteller: ' . $info['issuer']['CN'] . PHP_EOL;
echo 'Gültig bis: ' . date('d.m.Y', $info['validTo_time_t']) . PHP_EOL;
Subject: example.com Aussteller: Let's Encrypt Authority X3 Gültig bis: 15.09.2025

Zertifikat direkt aus Datei laden

<?php
// Zertifikat über Dateipfad-Präfix file:// einlesen
$cert = openssl_x509_read('file:///etc/ssl/certs/example.pem');

if ($cert === false) {
    foreach (openssl_get_cert_locations() as $key => $path) {
        echo $key . ': ' . $path . PHP_EOL;
    }
    die('Zertifikat konnte nicht geladen werden.');
}

// Zertifikat als PEM in Variable exportieren
openssl_x509_export($cert, $pemOutput);
echo $pemOutput;
-----BEGIN CERTIFICATE----- MIIE.... -----END CERTIFICATE-----

Zertifikat eines Servers per SSL-Stream-Kontext auslesen

<?php
$context = stream_context_create([
    'ssl' => [
        'capture_peer_cert' => true,
        'verify_peer'       => true,
        'verify_peer_name'  => true,
    ]
]);

$client = stream_socket_client(
    'ssl://example.com:443',
    $errno,
    $errstr,
    30,
    STREAM_CLIENT_CONNECT,
    $context
);

$params = stream_context_get_params($client);
$cert   = openssl_x509_read($params['options']['ssl']['peer_certificate']);
$info   = openssl_x509_parse($cert);

echo 'Server-Zertifikat CN: ' . $info['subject']['CN'] . PHP_EOL;
Server-Zertifikat CN: example.com

// Wichtig · Fallstricke

Sicherheitshinweis: Validieren Sie Zertifikate stets mit openssl_x509_verify() oder über eine vertrauenswürdige CA-Kette, bevor Sie ihnen vertrauen. Ein erfolgreich geparster Zertifikat bedeutet nicht zwingend, dass es gültig oder vertrauenswürdig ist.

PHP 8.0: Ab PHP 8.0 wird anstelle einer Ressource ein OpenSSLCertificate-Objekt zurückgegeben. Der Aufruf von openssl_x509_free() ist seitdem wirkungslos und nicht mehr notwendig.

Beim Übergeben eines Dateipfades ist das Präfix file:// zwingend erforderlich. Ein einfacher Pfad ohne Präfix wird als PEM-String interpretiert und schlägt fehl.