Signatur
Beschreibung
OpenSSLAsymmetricKey ist eine vollständig opake Klasse, die in PHP 8.0 eingeführt wurde, um den bisherigen resource-Typ für OpenSSL-Schlüssel abzulösen. Instanzen dieser Klasse werden ausschließlich von OpenSSL-Funktionen wie openssl_pkey_new(), openssl_pkey_get_public() oder openssl_pkey_get_private() erzeugt – eine direkte Instanziierung per new OpenSSLAsymmetricKey() ist nicht möglich.
Die Klasse kapselt intern den privaten oder öffentlichen Schlüssel und wird als Parameter oder Rückgabewert zahlreicher OpenSSL-Funktionen verwendet, etwa für openssl_sign(), openssl_verify(), openssl_public_encrypt() und openssl_private_decrypt(). Da die Klasse vollständig opak ist, können ihre internen Daten nicht direkt gelesen oder manipuliert werden; der Zugriff auf Schlüsseldetails erfolgt über openssl_pkey_get_details().
Vor PHP 8.0 lieferten diese Funktionen einen resource-Typ, der mit openssl_free_key() explizit freigegeben werden musste. Mit OpenSSLAsymmetricKey übernimmt die PHP-Garbage-Collection automatisch die Ressourcenfreigabe, sobald keine Referenz mehr auf das Objekt besteht. openssl_free_key() ist seit PHP 8.0 als veraltet markiert und nicht mehr nötig.
Beim Schreiben von Code, der mit PHP 7 und PHP 8 kompatibel sein soll, empfiehlt es sich, den Typ per instanceof OpenSSLAsymmetricKey zu prüfen und auf is_resource()-Prüfungen zu verzichten, da letztere in PHP 8 für diese Objekte nicht mehr true zurückgeben.
Beispiele
Neues RSA-Schlüsselpaar erzeugen und Details abrufen
<?php
// Neues 2048-Bit-RSA-Schlüsselpaar erstellen
$keyResource = openssl_pkey_new([
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);
if (!($keyResource instanceof OpenSSLAsymmetricKey)) {
throw new RuntimeException('Schlüsselerzeugung fehlgeschlagen.');
}
// Öffentlichen Schlüssel exportieren
$details = openssl_pkey_get_details($keyResource);
echo "Schlüsseltyp: RSA" . PHP_EOL;
echo "Schlüssellänge (Bits): " . $details['bits'] . PHP_EOL;
echo "Öffentlicher Schlüssel:" . PHP_EOL;
echo $details['key'];
// In PHP 8 keine manuelle Freigabe nötig – Garbage Collection erledigt das automatisch
Signatur erstellen und verifizieren
<?php
// Privaten Schlüssel laden
$privatePem = file_get_contents('/pfad/zum/private_key.pem');
$privateKey = openssl_pkey_get_private($privatePem);
if (!($privateKey instanceof OpenSSLAsymmetricKey)) {
throw new RuntimeException('Privater Schlüssel konnte nicht geladen werden.');
}
$daten = 'Dies ist eine wichtige Nachricht.';
// Signatur erzeugen
openssl_sign($daten, $signatur, $privateKey, OPENSSL_ALGO_SHA256);
echo 'Signatur (Base64): ' . base64_encode($signatur) . PHP_EOL;
// Öffentlichen Schlüssel extrahieren und Signatur verifizieren
$details = openssl_pkey_get_details($privateKey);
$publicKey = openssl_pkey_get_public($details['key']);
$ergebnis = openssl_verify($daten, $signatur, $publicKey, OPENSSL_ALGO_SHA256);
if ($ergebnis === 1) {
echo 'Signatur ist gültig.' . PHP_EOL;
} elseif ($ergebnis === 0) {
echo 'Signatur ist UNGÜLTIG.' . PHP_EOL;
} else {
echo 'Fehler bei der Signaturprüfung.' . PHP_EOL;
}
// Wichtig · Fallstricke
Migration von PHP 7 auf PHP 8: Funktionen wie openssl_pkey_get_private() und openssl_pkey_get_public() gaben in PHP 7 einen resource-Typ zurück. Prüfungen mit is_resource() müssen in PHP 8 durch instanceof OpenSSLAsymmetricKey ersetzt werden.
Kein manuelles Freigeben: openssl_free_key() ist in PHP 8.0 als deprecated markiert und seit PHP 8.4 entfernt. Schlüssel werden automatisch freigegeben, sobald das Objekt nicht mehr referenziert wird.
Sicherheitshinweis: Private Schlüssel sollten niemals im Klartext geloggt, serialisiert oder in Fehlermeldungen ausgegeben werden. OpenSSLAsymmetricKey-Objekte sind nicht serialisierbar – ein Versuch wirft eine Exception.
Opake Klasse: Da die Klasse keine öffentlichen Eigenschaften oder Methoden besitzt, ist der einzige standardisierte Weg zur Inspektion eines Schlüssels der Aufruf von openssl_pkey_get_details().