Start · Sprachen · PHP · Referenz · openssl_pkcs12_export

openssl_pkcs12_export

Funktion

Exportiert ein X.509-Zertifikat zusammen mit dem zugehörigen privaten Schlüssel als PKCS#12-Archiv in eine Variable.

seit PHP 5.2.2 Kategorie: crypto

Signatur

openssl_pkcs12_export(OpenSSLCertificate|string $certificate, string &$output, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $private_key, string $passphrase, array $options = []): bool

Beschreibung

Mit openssl_pkcs12_export() lässt sich ein Zertifikat (X.509), der dazugehörige private Schlüssel und optional eine Kette von CA-Zertifikaten in das weit verbreitete PKCS#12-Format (auch .p12 oder .pfx) bündeln. Das Ergebnis wird nicht in eine Datei geschrieben, sondern direkt in die übergebene Variable $output gelegt – ideal für Weiterverarbeitung im Arbeitsspeicher oder die sofortige Ausgabe an den Browser.

PKCS#12 ist ein binäres Container-Format, das häufig für den Import/Export von Zertifikaten in Browser, E-Mail-Clients oder andere Anwendungen verwendet wird. Der Inhalt wird mit dem $passphrase-Parameter verschlüsselt, wodurch das Archiv passwortgeschützt ist – eine leere Zeichenkette deaktiviert den Passwortschutz, was jedoch nicht empfohlen wird.

Über das optionale $options-Array können zusätzliche Informationen mitgegeben werden: unter dem Schlüssel extracerts eine Liste weiterer Zertifikate (z. B. Zwischen-CAs), unter friendlyname ein menschenlesbarer Anzeigename für das Zertifikat. Diese Felder werden von vielen Clients ausgewertet.

Soll die Ausgabe direkt als Datei gespeichert werden, steht openssl_pkcs12_export_to_file() zur Verfügung, das denselben Prozess direkt in ein Dateisystem schreibt.

Parameter

Name Typ Default Beschreibung
$certificate Pflicht OpenSSLCertificate|string Das zu exportierende X.509-Zertifikat als OpenSSLCertificate-Objekt (ab PHP 8.0) oder als PEM-kodierter String bzw. Dateipfad mit file://-Präfix.
$output Pflicht string Referenz auf eine Variable, in die das erzeugte PKCS#12-Archiv als binärer String geschrieben wird. Vorhandener Inhalt wird überschrieben.
$private_key Pflicht OpenSSLAsymmetricKey|OpenSSLCertificate|array|string Der zum Zertifikat gehörende private Schlüssel. Kann ein OpenSSLAsymmetricKey-Objekt, ein PEM-String, ein Dateipfad mit file:// oder ein Array der Form [$key, $passphrase] für verschlüsselte Schlüssel sein.
$passphrase Pflicht string Passwort, mit dem das PKCS#12-Archiv verschlüsselt wird. Eine leere Zeichenkette erzeugt ein unverschlüsseltes Archiv, was aus Sicherheitsgründen vermieden werden sollte.
$options array [] Optionales Konfigurationsarray. Unterstützte Schlüssel: extracerts (Array zusätzlicher CA-Zertifikate), friendlyname (Anzeigename als String).

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Export erfolgreich war, andernfalls false. Im Fehlerfall (z. B. ungültiges Zertifikat oder nicht passender Schlüssel) enthält $output keinen verwertbaren Inhalt.

Beispiele

Einfacher Export in eine Variable und Ausgabe als Download

<?php
// Zertifikat und Schlüssel aus PEM-Dateien laden
$certPem = file_get_contents('/etc/ssl/certs/mein-zertifikat.pem');
$keyPem  = file_get_contents('/etc/ssl/private/mein-schluessel.pem');

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

$pkcs12Output = '';
$passphrase   = 'geheimesPasswort123';

if (openssl_pkcs12_export($cert, $pkcs12Output, $key, $passphrase)) {
    // Als P12-Datei an den Browser senden
    header('Content-Type: application/x-pkcs12');
    header('Content-Disposition: attachment; filename="zertifikat.p12"');
    header('Content-Length: ' . strlen($pkcs12Output));
    echo $pkcs12Output;
} else {
    echo 'Fehler beim Exportieren des Zertifikats.';
}

Export mit CA-Zertifikatskette und Anzeigename

<?php
// Zertifikat, Schlüssel und Zwischenzertifikat laden
$cert    = openssl_x509_read(file_get_contents('server.crt'));
$key     = openssl_pkey_get_private(file_get_contents('server.key'));
$interCA = file_get_contents('intermediate-ca.crt');

$options = [
    'extracerts'   => [$interCA],
    'friendlyname' => 'Mein Webserver-Zertifikat',
];

$pkcs12Daten = '';

if (openssl_pkcs12_export($cert, $pkcs12Daten, $key, 's3cr3t!', $options)) {
    // Binäres Archiv in Datenbank oder Session speichern
    $base64 = base64_encode($pkcs12Daten);
    echo 'PKCS#12 (Base64): ' . substr($base64, 0, 40) . '...';
} else {
    // OpenSSL-Fehler ausgeben
    while ($err = openssl_error_string()) {
        echo 'OpenSSL-Fehler: ' . $err . PHP_EOL;
    }
}
PKCS#12 (Base64): MIIKHAIBAzCCCdYGCSqGSIb3DQEHA...

// Wichtig · Fallstricke

Sicherheit: Verwende stets ein starkes Passwort für $passphrase. Ein leeres Passwort erzeugt ein unverschlüsseltes Archiv, in dem der private Schlüssel im Klartext vorliegt. Speichere das Passwort niemals zusammen mit dem Archiv.

Schlüssel muss zum Zertifikat passen: Stimmen Zertifikat und privater Schlüssel nicht überein, schlägt die Funktion kommentarlos fehl (Rückgabe false). Prüfe den genauen Fehler mit openssl_error_string().

PHP 8.0+: Ab PHP 8.0 wurden die ressourcenbasierten Typen durch Klassen (OpenSSLCertificate, OpenSSLAsymmetricKey) ersetzt. Älterer Code, der resource-Typen verwendet, funktioniert noch, sollte aber migriert werden.

Binäres Format: Der erzeugte $output-String ist binär und nicht druckbar. Für Textprotokolle (JSON, XML) Base64-kodieren.