Signatur
Beschreibung
openssl_pkey_export() serialisiert einen privaten Schlüssel im PEM-Format (Privacy Enhanced Mail) und schreibt das Ergebnis in die per Referenz übergebene Variable $output. Die Funktion wird typischerweise eingesetzt, wenn ein erzeugter oder geladener Schlüssel dauerhaft gespeichert, übertragen oder einer anderen Komponente übergeben werden soll.
Optional kann der exportierte Schlüssel mit einer Passphrase verschlüsselt werden. Wird $passphrase angegeben, wird der private Schlüssel mit AES-256-CBC (oder einem ähnlichen Algorithmus, abhängig von der OpenSSL-Konfiguration) gesichert. Ohne Passphrase liegt der Schlüssel im Klartext als PEM vor – das sollte in Produktivumgebungen vermieden werden.
Über das $options-Array können zusätzliche OpenSSL-Konfigurationsparameter übergeben werden, etwa config (Pfad zu einer alternativen openssl.cnf), encrypt_key oder encrypt_key_cipher. Diese entsprechen den Optionen, die auch openssl_csr_new() und verwandte Funktionen akzeptieren.
Die Funktion gibt true zurück, wenn der Export erfolgreich war, andernfalls false. Fehlerdetails lassen sich mit openssl_error_string() abfragen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $key Pflicht | OpenSSLAsymmetricKey|array|string | Der zu exportierende private Schlüssel. Akzeptiert eine OpenSSLAsymmetricKey-Ressource (ab PHP 8.0), ein Array der Form ["key" => $pem, "passphrase" => $pass] oder einen PEM-kodierten String. |
|
| $output Pflicht | string | Referenz-Variable, in die der PEM-kodierte private Schlüssel geschrieben wird. Der vorherige Inhalt wird überschrieben. | |
| $passphrase | ?string | null | Optionale Passphrase zur Verschlüsselung des exportierten Schlüssels. Wird null oder ein leerer String übergeben, erfolgt kein Passwortschutz. |
| $options | ?array | null | Zusätzliche OpenSSL-Konfigurationsoptionen als assoziatives Array, z. B. ['config' => '/pfad/zu/openssl.cnf']. Entspricht den Optionen anderer openssl_*-Funktionen. |
Rückgabewert
true zurück, wenn der Schlüssel erfolgreich exportiert wurde, andernfalls false. Im Fehlerfall liefert openssl_error_string() weitere Details.Beispiele
Privaten RSA-Schlüssel ohne Passphrase exportieren
<?php
// Neues RSA-2048-Schlüsselpaar erzeugen
$res = openssl_pkey_new([
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);
$pemKey = '';
$success = openssl_pkey_export($res, $pemKey);
if ($success) {
echo "Export erfolgreich.\n";
// PEM-Schlüssel in Datei speichern (Berechtigungen beachten!)
file_put_contents('/secure/path/private.pem', $pemKey);
chmod('/secure/path/private.pem', 0600);
} else {
echo 'Fehler: ' . openssl_error_string() . "\n";
}
Privaten Schlüssel mit Passphrase verschlüsselt exportieren
<?php
// Schlüsselpaar erzeugen
$res = openssl_pkey_new([
'private_key_bits' => 4096,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);
$passphrase = 'mein-geheimes-passwort';
$pemKey = '';
if (openssl_pkey_export($res, $pemKey, $passphrase)) {
echo "Verschlüsselter Schlüssel:\n";
echo $pemKey;
} else {
while ($msg = openssl_error_string()) {
echo 'OpenSSL-Fehler: ' . $msg . "\n";
}
}
Schlüssel aus PEM-Datei laden und erneut exportieren
<?php
// Vorhandenen passwortgeschützten Schlüssel laden
$existingPem = file_get_contents('/secure/path/encrypted.pem');
$key = openssl_pkey_get_private($existingPem, 'altes-passwort');
if ($key === false) {
die('Schlüssel konnte nicht geladen werden: ' . openssl_error_string());
}
$newPem = '';
// Mit neuer Passphrase erneut exportieren
if (openssl_pkey_export($key, $newPem, 'neues-passwort')) {
file_put_contents('/secure/path/encrypted_new.pem', $newPem);
echo "Schlüssel erfolgreich mit neuer Passphrase gespeichert.\n";
}
// Wichtig · Fallstricke
Sicherheitshinweis: Ein privater Schlüssel im Klartext (ohne Passphrase) sollte niemals in versionierten Dateien, Logs oder unsicheren Speicherorten abgelegt werden. Dateisystemberechtigungen sollten auf 0600 oder restriktiver gesetzt werden.
Passphrase-Qualität: Wird eine Passphrase verwendet, sollte diese ausreichend lang und komplex sein. Eine schwache Passphrase bietet kaum zusätzlichen Schutz gegenüber einem unverschlüsselten Schlüssel.
Nur private Schlüssel: openssl_pkey_export() exportiert ausschließlich den privaten Teil eines Schlüsselpaares. Für den öffentlichen Schlüssel steht openssl_pkey_get_details() zur Verfügung.
PHP 8.0: Ab PHP 8.0 werden OpenSSL-Schlüsselressourcen als Objekte vom Typ OpenSSLAsymmetricKey zurückgegeben, statt als resource. Der bisherige Code bleibt weitgehend kompatibel.