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