Start · Sprachen · PHP · Referenz · openssl_x509_export

openssl_x509_export

Funktion

Exportiert ein X.509-Zertifikat in das PEM-Format und speichert es in einer Variablen.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_x509_export(OpenSSLCertificate|string $certificate, string &$output, bool $no_text = true): bool

Beschreibung

openssl_x509_export() konvertiert ein X.509-Zertifikat in das PEM-kodierte Format (Base64-kodiertes DER) und schreibt das Ergebnis in die übergebene Ausgabevariable. Diese Funktion ist nützlich, wenn ein Zertifikat aus einer Ressource oder einem String in ein transportierbares Textformat überführt werden soll, etwa um es in einer Datenbank zu speichern, per API zu übertragen oder in Konfigurationsdateien einzubetten.

Das exportierte PEM-Zertifikat beginnt mit -----BEGIN CERTIFICATE----- und endet mit -----END CERTIFICATE-----. Durch den Parameter no_text kann gesteuert werden, ob vor dem PEM-Block ein menschenlesbarer Klartext mit Zertifikatsdetails (Aussteller, Gültigkeitszeitraum, Fingerprint usw.) hinzugefügt wird.

Im Unterschied zu openssl_x509_export_to_file() schreibt diese Funktion nicht in eine Datei, sondern befüllt eine PHP-Variable, was eine flexiblere Weiterverarbeitung im Speicher ermöglicht. Typische Einsatzgebiete sind TLS-Client-Authentifizierung, Zertifikatskettenaufbau oder das dynamische Erzeugen von PEM-Bundles.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das zu exportierende X.509-Zertifikat. Kann ein OpenSSLCertificate-Objekt (ab PHP 8.0), eine OpenSSL-Ressource (PHP < 8.0) oder ein PEM-kodierter Zertifikatsstring sein.
$output Pflicht string Referenz auf eine Variable, in die das exportierte PEM-Zertifikat geschrieben wird. Der bisherige Inhalt der Variablen wird überschrieben.
$no_text bool true Ist dieser Wert false, wird dem PEM-Block ein menschenlesbarer Klartextabschnitt mit Zertifikatsdetails vorangestellt. Standard ist true (kein Klartext).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Zertifikat erfolgreich exportiert wurde, andernfalls false. Bei einem Fehler (z. B. ungültiges Zertifikat) bleibt $output unverändert.

Beispiele

Zertifikat aus Datei in PEM-String exportieren

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

if ($cert === false) {
    die('Zertifikat konnte nicht geladen werden.');
}

// Zertifikat als PEM-String exportieren (ohne Klartext)
$pemOutput = '';
if (openssl_x509_export($cert, $pemOutput)) {
    echo "Exportiertes PEM-Zertifikat:\n";
    echo $pemOutput;
} else {
    echo 'Export fehlgeschlagen.';
}
Exportiertes PEM-Zertifikat: -----BEGIN CERTIFICATE----- MIID...base64-kodierte Daten... -----END CERTIFICATE-----

Selbstsigniertes Zertifikat erstellen und als PEM-String speichern

<?php
// Privaten Schlüssel erzeugen
$privateKey = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

// CSR erstellen
$dn = [
    'countryName'            => 'DE',
    'stateOrProvinceName'    => 'Bayern',
    'localityName'           => 'München',
    'organizationName'       => 'Muster GmbH',
    'commonName'             => 'example.local',
];
$csr = openssl_csr_new($dn, $privateKey);

// Selbstsigniertes Zertifikat (gültig 365 Tage)
$cert = openssl_csr_sign($csr, null, $privateKey, 365);

// PEM-Export mit menschenlesbarem Klartext
$pemString = '';
if (openssl_x509_export($cert, $pemString, false)) {
    echo $pemString;
    // Zertifikat z. B. in Datenbank oder Session speichern
    // $_SESSION['tls_cert'] = $pemString;
} else {
    echo 'Fehler beim Exportieren des Zertifikats.';
}
Certificate: Data: Version: 3 (0x2) ... -----BEGIN CERTIFICATE----- MIID... -----END CERTIFICATE-----

// Wichtig · Fallstricke

Sicherheitshinweis: Das exportierte PEM-Zertifikat enthält ausschließlich den öffentlichen Teil des Zertifikats und keinen privaten Schlüssel. Es kann daher bedenkenlos übertragen oder gespeichert werden. Für den Export privater Schlüssel ist openssl_pkey_export() zuständig.

Ab PHP 8.0 werden OpenSSL-Zertifikate als OpenSSLCertificate-Objekte statt als Ressourcen zurückgegeben. Der Parameter $certificate akzeptiert jedoch beide Formen für Abwärtskompatibilität. Bei der Übergabe eines PEM-Strings als $certificate wird dieser intern zunächst geparst — ein fehlerhafter String führt zu false als Rückgabewert.