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