Start · Sprachen · PHP · Referenz · openssl_pkey_export_to_file

openssl_pkey_export_to_file

Funktion

Exportiert einen privaten Schlüssel im PEM-Format in eine Datei, optional verschlüsselt mit einer Passphrase.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_pkey_export_to_file(OpenSSLAsymmetricKey|array|string $key, string $output_filename, ?string $passphrase = null, ?array $options = null): bool

Beschreibung

openssl_pkey_export_to_file() schreibt einen privaten asymmetrischen Schlüssel im PEM-Format (Privacy Enhanced Mail) in eine Datei auf dem Dateisystem. Die Funktion eignet sich besonders dann, wenn Schlüssel persistent gespeichert werden sollen, etwa für TLS-Zertifikate, Code-Signing oder sichere Kommunikationsinfrastruktur.

Der Schlüssel kann optional mit einer Passphrase verschlüsselt werden, sodass er ohne diese nicht verwendet werden kann. Das schützt den privaten Schlüssel vor unbefugtem Zugriff selbst dann, wenn die Datei in falsche Hände gelangt. Intern wird dafür standardmäßig AES-128-CBC verwendet, sofern nicht über $options ein anderer Cipher vorgegeben wird.

Der Parameter $options akzeptiert ein assoziatives Array mit OpenSSL-Konfigurationswerten (z. B. cipher_algo, config), mit dem das Verhalten der Schlüsselerzeugung und -kodierung gesteuert werden kann. Wird null übergeben, gelten die systemweiten OpenSSL-Standardwerte.

Die Zieldatei wird vom Webserver-Prozess erzeugt; es ist daher wichtig, die Dateiberechtigungen restriktiv zu setzen (z. B. chmod 600) und die Datei außerhalb des Web-Roots zu speichern, um unbefugten Zugriff zu verhindern.

Parameter

Name Typ Default Beschreibung
$key Pflicht OpenSSLAsymmetricKey|array|string Der zu exportierende private Schlüssel. Kann ein OpenSSLAsymmetricKey-Objekt (seit PHP 8.0), ein Array im Format [zertifikat, passphrase] oder ein PEM-kodierter String sein.
$output_filename Pflicht string Pfad zur Zieldatei, in die der Schlüssel geschrieben werden soll. Der Prozess muss Schreibrechte auf diesen Pfad haben.
$passphrase ?string null Optionale Passphrase, mit der der exportierte Schlüssel verschlüsselt wird. Wird null oder ein leerer String übergeben, wird der Schlüssel unverschlüsselt gespeichert.
$options ?array null Optionales Array mit OpenSSL-Konfigurationsoptionen, z. B. ['config' => '/pfad/zu/openssl.cnf']. Überschreibt die systemweiten Standardwerte.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn der Schlüssel erfolgreich in die Datei geschrieben wurde. Im Fehlerfall (z. B. fehlende Schreibrechte, ungültiger Schlüssel) wird false zurückgegeben. Fehlermeldungen lassen sich mit openssl_error_string() abrufen.

Beispiele

RSA-Schlüssel erzeugen und verschlüsselt in Datei speichern

<?php
// Neuen RSA-Schlüssel mit 4096 Bit erzeugen
$key = openssl_pkey_new([
    'private_key_bits' => 4096,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

if ($key === false) {
    die('Schlüsselerzeugung fehlgeschlagen: ' . openssl_error_string());
}

$datei  = '/var/secure/keys/mein_privater_schluessel.pem';
$passphrase = 'sEhr$icheres-Pa55wort';

$erfolg = openssl_pkey_export_to_file($key, $datei, $passphrase);

if ($erfolg) {
    chmod($datei, 0600); // Nur Eigentümer darf lesen/schreiben
    echo "Schlüssel erfolgreich gespeichert.\n";
} else {
    echo 'Fehler beim Speichern: ' . openssl_error_string() . "\n";
}
Schlüssel erfolgreich gespeichert.

Bereits vorhandenen Schlüssel ohne Passphrase exportieren

<?php
// Vorhandenen PEM-Schlüssel einlesen und unverschlüsselt erneut speichern
$pemInhalt = file_get_contents('/var/secure/keys/verschluesselt.pem');

$key = openssl_pkey_get_private($pemInhalt, 'alte-passphrase');

if ($key === false) {
    die('Schlüssel konnte nicht geladen werden: ' . openssl_error_string());
}

$ziel = '/var/secure/keys/unverschluesselt.pem';

if (openssl_pkey_export_to_file($key, $ziel)) {
    chmod($ziel, 0600);
    echo "Unverschlüsselter Schlüssel wurde gespeichert.\n";
} else {
    echo 'Fehler: ' . openssl_error_string() . "\n";
}
Unverschlüsselter Schlüssel wurde gespeichert.

// Wichtig · Fallstricke

Sicherheitshinweis: Private Schlüssel dürfen niemals im Web-Root gespeichert werden, da sie sonst über den Webserver abrufbar sein könnten. Speichere sie stets außerhalb des Document-Roots und setze restriktive Dateisystemrechte (chmod 600).

Unverschlüsselte Schlüssel: Wird keine Passphrase übergeben, liegt der Schlüssel im Klartext in der Datei. In Produktionsumgebungen sollte immer eine starke Passphrase verwendet werden, sofern kein automatischer Dienst den Schlüssel einlesen muss.

Fehlerdiagnose: Im Fehlerfall gibt die Funktion lediglich false zurück. Detaillierte OpenSSL-Fehlermeldungen können iterativ per openssl_error_string() ausgelesen werden, da OpenSSL intern einen Fehler-Stack pflegt.

PHP 8.0+: Das früher verwendete resource-Handle für Schlüssel wurde durch die Klasse OpenSSLAsymmetricKey ersetzt. Älterer Code, der is_resource() prüft, muss angepasst werden.