Start · Sprachen · PHP · Referenz · openssl_pkey_get_details

openssl_pkey_get_details

Funktion

Liefert ein assoziatives Array mit Details zu einem OpenSSL-Schlüssel, einschließlich Bitlänge, Typ und schlüsseltyp-spezifischer Parameter.

seit PHP 5.2.0 Kategorie: crypto

Signatur

openssl_pkey_get_details(OpenSSLAsymmetricKey $key): array|false

Beschreibung

openssl_pkey_get_details() extrahiert alle relevanten Informationen aus einem OpenSSL-Schlüsselobjekt (Instanz von OpenSSLAsymmetricKey). Das zurückgegebene Array enthält stets die Felder bits (Schlüssellänge in Bit), key (öffentlicher Schlüssel im PEM-Format) und type (numerische Typkennung, z. B. OPENSSL_KEYTYPE_RSA).

Abhängig vom Schlüsseltyp enthält das Array zusätzliche Felder: Bei RSA-Schlüsseln findet sich ein Unter-Array rsa mit den Komponenten n, e, d, p, q, dmp1, dmq1 und iqmp. DSA-Schlüssel liefern ein dsa-Array, EC-Schlüssel ein ec-Array mit Kurvenname, öffentlichem und privatem Punkt.

Die Funktion ist besonders nützlich, wenn man Schlüsseleigenschaften prüfen (z. B. Mindestbitlänge sicherstellen), Schlüsselkomponenten exportieren oder den Schlüsseltyp feststellen möchte, bevor kryptografische Operationen durchgeführt werden.

Ein gültiger Schlüssel-Handle wird üblicherweise mit openssl_pkey_new(), openssl_pkey_get_public() oder openssl_pkey_get_private() erzeugt. Ab PHP 8.0 ist der Rückgabetyp ein Objekt (OpenSSLAsymmetricKey) statt einer Ressource.

Parameter

Name Typ Default Beschreibung
$key Pflicht OpenSSLAsymmetricKey Ein gültiges OpenSSL-Schlüsselobjekt (öffentlicher oder privater Schlüssel), das z. B. mit openssl_pkey_new() oder openssl_pkey_get_public() erstellt wurde.

Rückgabewert

Typ
array|false
Beschreibung
Gibt bei Erfolg ein assoziatives Array mit mindestens den Feldern bits (int), key (string, PEM) und type (int) zurück. Bei einem ungültigen Schlüssel oder einem Fehler wird false zurückgegeben.

Beispiele

RSA-Schlüsseldetails auslesen und Bitlänge prüfen

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

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

$details = openssl_pkey_get_details($keyResource);

if ($details === false) {
    die('Details konnten nicht ausgelesen werden.');
}

echo 'Schlüsseltyp : ' . $details['type'] . PHP_EOL;   // 0 = OPENSSL_KEYTYPE_RSA
echo 'Bitlänge     : ' . $details['bits'] . PHP_EOL;   // 2048
echo 'Öff. Schlüssel (PEM):' . PHP_EOL;
echo $details['key'];

// RSA-spezifische Komponente (Modulus) als Hex ausgeben
echo 'Modulus (n, hex): ' . bin2hex($details['rsa']['n']) . PHP_EOL;
Schlüsseltyp : 0 Bitlänge : 2048 Öff. Schlüssel (PEM): -----BEGIN PUBLIC KEY----- ... (Base64-Daten) ... -----END PUBLIC KEY----- Modulus (n, hex): ...

Mindest-Schlüssellänge bei importiertem öffentlichem Schlüssel sicherstellen

<?php
$pemPublic = file_get_contents('/pfad/zum/public_key.pem');

$pubKey = openssl_pkey_get_public($pemPublic);

if ($pubKey === false) {
    die('Öffentlicher Schlüssel ungültig.');
}

$details = openssl_pkey_get_details($pubKey);

if ($details === false) {
    die('Schlüsseldetails nicht abrufbar.');
}

$minBits = 2048;
if ($details['bits'] < $minBits) {
    throw new RuntimeException(
        sprintf('Schlüssel zu schwach: %d Bit (Minimum: %d Bit).', $details['bits'], $minBits)
    );
}

echo 'Schlüssel akzeptiert: ' . $details['bits'] . ' Bit.' . PHP_EOL;
Schlüssel akzeptiert: 2048 Bit.

EC-Schlüsseldetails inkl. Kurvenname lesen

<?php
// EC-Schlüsselpaar mit Kurve prime256v1 erzeugen
$ecKey = openssl_pkey_new([
    'private_key_type' => OPENSSL_KEYTYPE_EC,
    'curve_name'       => 'prime256v1',
]);

$details = openssl_pkey_get_details($ecKey);

echo 'Typ      : ' . $details['type'] . PHP_EOL;  // 3 = OPENSSL_KEYTYPE_EC
echo 'Bitlänge : ' . $details['bits'] . PHP_EOL;  // 256
echo 'Kurve    : ' . $details['ec']['curve_name'] . PHP_EOL; // prime256v1
Typ : 3 Bitlänge : 256 Kurve : prime256v1

// Wichtig · Fallstricke

Sicherheitshinweis: Wenn der übergebene Schlüssel ein privater Schlüssel ist, enthält das zurückgegebene Array je nach Schlüsseltyp auch private Schlüsselkomponenten (z. B. rsa['d'], ec['d']). Diese Daten dürfen niemals protokolliert, ausgegeben oder unsicher übertragen werden.

Die Typkonstanten für das Feld type sind: OPENSSL_KEYTYPE_RSA (0), OPENSSL_KEYTYPE_DSA (1), OPENSSL_KEYTYPE_DH (2), OPENSSL_KEYTYPE_EC (3).

Ab PHP 8.0 wurde der frühere Ressourcentyp resource durch die Klasse OpenSSLAsymmetricKey ersetzt. Code, der auf den alten Ressourcentyp prüft (z. B. is_resource()), muss angepasst werden.

Die binären Schlüsselkomponenten (z. B. rsa['n']) liegen als rohe Byte-Strings vor und müssen für eine lesbare Ausgabe z. B. mit bin2hex() oder base64_encode() konvertiert werden.