Start · Sprachen · PHP · Referenz · openssl_pkey_free

openssl_pkey_free

Funktion

Gibt den Speicher eines privaten/öffentlichen OpenSSL-Schlüssels frei, der zuvor durch <code>openssl_pkey_new()</code> oder <code>openssl_pkey_get_private()</code> erzeugt wurde.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_pkey_free(OpenSSLAsymmetricKey $key): void

Beschreibung

openssl_pkey_free() gibt die internen OpenSSL-Ressourcen eines asymmetrischen Schlüssels frei. In PHP-Versionen bis 7.4 nahm die Funktion eine resource entgegen; seit PHP 8.0 wird stattdessen ein OpenSSLAsymmetricKey-Objekt verwendet, das bei der Garbage Collection automatisch freigegeben wird.

Obwohl PHP durch seinen automatischen Garbage Collector Ressourcen am Ende eines Skripts ohnehin bereinigt, ist ein expliziter Aufruf von openssl_pkey_free() bei langlebigen Prozessen oder bei der Verarbeitung vieler Schlüssel in einer Schleife empfehlenswert, um Speicherlecks zu vermeiden.

Seit PHP 8.0 ist die Funktion weitgehend redundant, da OpenSSLAsymmetricKey-Objekte als normale PHP-Objekte behandelt werden und automatisch destruiert werden, sobald kein Verweis mehr auf sie existiert. Der Aufruf ist jedoch weiterhin vorhanden und löst keine Fehler aus, sodass bestehender Code kompatibel bleibt.

Typischerweise wird openssl_pkey_free() am Ende einer kryptografischen Operation aufgerufen – etwa nach dem Signieren, Verschlüsseln oder dem Export eines Schlüssels –, um sicherzustellen, dass sensible Schlüsseldaten so früh wie möglich aus dem Speicher entfernt werden.

Parameter

Name Typ Default Beschreibung
$key Pflicht OpenSSLAsymmetricKey Das Schlüssel-Objekt (bzw. in PHP < 8.0 die Ressource), das freigegeben werden soll. Wird typischerweise von openssl_pkey_new(), openssl_pkey_get_private() oder openssl_pkey_get_public() zurückgegeben.

Rückgabewert

Typ
void
Beschreibung
Gibt keinen Wert zurück.

Beispiele

Schlüsselerzeugung und explizite Freigabe

<?php
// Neues RSA-Schlüsselpaar erzeugen
$key = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

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

// Privaten Schlüssel exportieren
openssl_pkey_export($key, $privateKeyPem);
echo "Privater Schlüssel erzeugt.\n";

// Details abrufen
$details = openssl_pkey_get_details($key);
echo 'Schlüssellänge: ' . $details['bits'] . ' Bit' . PHP_EOL;

// Schlüssel explizit freigeben
openssl_pkey_free($key);
echo 'Schlüssel freigegeben.' . PHP_EOL;
Privater Schlüssel erzeugt. Schlüssellänge: 2048 Bit Schlüssel freigegeben.

Mehrere Schlüssel in einer Schleife mit expliziter Freigabe

<?php
// Verarbeitung vieler Schlüssel – explizite Freigabe verhindert Speicherlecks
for ($i = 0; $i < 5; $i++) {
    $key = openssl_pkey_new([
        'private_key_bits' => 1024,
        'private_key_type' => OPENSSL_KEYTYPE_RSA,
    ]);

    if ($key === false) {
        echo 'Fehler bei Iteration ' . $i . PHP_EOL;
        continue;
    }

    $details = openssl_pkey_get_details($key);
    echo 'Schlüssel ' . ($i + 1) . ': ' . $details['bits'] . ' Bit' . PHP_EOL;

    // Speicher sofort freigeben, nicht auf GC warten
    openssl_pkey_free($key);
}
echo 'Alle Schlüssel freigegeben.';
Schlüssel 1: 1024 Bit Schlüssel 2: 1024 Bit Schlüssel 3: 1024 Bit Schlüssel 4: 1024 Bit Schlüssel 5: 1024 Bit Alle Schlüssel freigegeben.

// Wichtig · Fallstricke

Deprecation-Hinweis: In PHP 8.0 wurde der Ressourcentyp für Schlüssel durch das Objekt OpenSSLAsymmetricKey ersetzt. Die Funktion openssl_pkey_free() ist seit PHP 8.0 de facto ein No-Op, da Objekte automatisch durch den Garbage Collector freigegeben werden. Sie bleibt jedoch aus Gründen der Abwärtskompatibilität erhalten.

Sicherheitshinweis: Sensible kryptografische Schlüssel sollten so kurz wie möglich im Speicher gehalten werden. Auch wenn PHP keine sichere Speicherlöschung (secure memory wipe) garantiert, signalisiert openssl_pkey_free() die Absicht, den Schlüssel nicht mehr zu benötigen, und ermöglicht eine zeitnahe Freigabe.

PHP < 8.0: In älteren PHP-Versionen war der Parameter vom Typ resource. Die Freigabe war dort wichtiger, da PHP-Ressourcen nicht immer zuverlässig durch den GC bereinigt wurden.