Start · Sprachen · PHP · Referenz · openssl_pkey_export

openssl_pkey_export

Funktion

Exportiert einen privaten Schlüssel als PEM-kodierten String und speichert ihn in der übergebenen Variablen.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_pkey_export(OpenSSLAsymmetricKey|array|string $key, string &$output, ?string $passphrase = null, ?array $options = null): bool

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

Typ
bool
Beschreibung
Gibt 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";
}
Export erfolgreich.

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";
    }
}
Verschlüsselter Schlüssel: -----BEGIN ENCRYPTED PRIVATE KEY----- ...

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";
}
Schlüssel erfolgreich mit neuer Passphrase gespeichert.

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