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