Start · Sprachen · PHP · Referenz · openssl_pkey_get_public

openssl_pkey_get_public

Funktion

Extrahiert einen öffentlichen Schlüssel aus einem Zertifikat oder einer Schlüssel-Ressource und gibt ihn als <code>OpenSSLAsymmetricKey</code>-Objekt zurück.

seit PHP 4.0.4 Kategorie: crypto

Signatur

openssl_pkey_get_public(OpenSSLCertificate|OpenSSLAsymmetricKey|array|string $public_key): OpenSSLAsymmetricKey|false

Beschreibung

openssl_pkey_get_public() liest einen öffentlichen Schlüssel aus verschiedenen Quellen ein – etwa aus einem PEM-kodierten String, einem X.509-Zertifikat oder einer bereits geladenen OpenSSLCertificate-Ressource – und bereitet diesen für nachfolgende OpenSSL-Operationen vor. Das zurückgegebene OpenSSLAsymmetricKey-Objekt kann anschließend an Funktionen wie openssl_public_encrypt(), openssl_verify() oder openssl_seal() übergeben werden.

Der Parameter $public_key ist sehr flexibel: Er akzeptiert PEM-Strings, Dateipfade mit dem Präfix file://, OpenSSLCertificate-Objekte (z. B. aus openssl_x509_read()) sowie Arrays der Form [Zertifikat, Passphrase] für den Umgang mit verschlüsselten privaten Schlüsseln. In der Praxis wird meistens ein PEM-kodierter öffentlicher Schlüssel oder ein ganzes Zertifikat übergeben, aus dem der öffentliche Teil automatisch extrahiert wird.

Ab PHP 8.0 wird statt einer internen Ressource ein OpenSSLAsymmetricKey-Objekt zurückgegeben. In älteren PHP-Versionen (5.x / 7.x) war der Rückgabewert eine Ressource vom Typ OpenSSL key. Ein explizites Freigeben des Schlüssels mit openssl_pkey_free() ist ab PHP 8.0 nicht mehr notwendig, da das Objekt durch den Garbage Collector aufgeräumt wird.

Schlägt die Funktion fehl – etwa weil der übergebene Schlüssel oder das Zertifikat ungültig ist –, gibt sie false zurück. Fehlermeldungen können über openssl_error_string() abgerufen werden.

Parameter

Name Typ Default Beschreibung
$public_key Pflicht OpenSSLCertificate|OpenSSLAsymmetricKey|array|string

Die Quelle des öffentlichen Schlüssels. Folgende Formate werden akzeptiert:

  • Ein PEM-kodierter String, der direkt den öffentlichen Schlüssel enthält.
  • Ein Dateipfad mit dem Präfix file:// zu einer PEM-Datei.
  • Ein OpenSSLCertificate-Objekt (z. B. aus openssl_x509_read()), aus dem der öffentliche Schlüssel extrahiert wird.
  • Ein OpenSSLAsymmetricKey-Objekt, das bereits einen öffentlichen oder privaten Schlüssel repräsentiert.
  • Ein Array der Form [mixed $cert, string $passphrase] für passwortgeschützte Schlüssel.

Rückgabewert

Typ
OpenSSLAsymmetricKey|false
Beschreibung
Gibt bei Erfolg ein OpenSSLAsymmetricKey-Objekt zurück, das den extrahierten öffentlichen Schlüssel repräsentiert. Im Fehlerfall wird false zurückgegeben.

Beispiele

Öffentlichen Schlüssel aus PEM-String laden und für Verschlüsselung nutzen

<?php
$pemPublicKey = <<<EOT
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2a2rwplBQLF29amygykE
MmYz0+Kcj3bKBp29Ho3GLUMW8tI7mHpBBOLWYGMvMKiuW6VZtbRGIQPgbHqTmOp
AQIDAQAB
-----END PUBLIC KEY-----
EOT;

$publicKey = openssl_pkey_get_public($pemPublicKey);

if ($publicKey === false) {
    echo 'Fehler beim Laden des öffentlichen Schlüssels: ' . openssl_error_string();
    exit;
}

$plaintext = 'Geheime Nachricht';
$encrypted = '';

if (openssl_public_encrypt($plaintext, $encrypted, $publicKey)) {
    echo 'Verschlüsselung erfolgreich. Länge: ' . strlen($encrypted) . ' Bytes';
} else {
    echo 'Verschlüsselung fehlgeschlagen: ' . openssl_error_string();
}
Verschlüsselung erfolgreich. Länge: 256 Bytes

Öffentlichen Schlüssel aus X.509-Zertifikat extrahieren

<?php
// Zertifikat aus einer Datei laden
$cert = openssl_x509_read(file_get_contents('/etc/ssl/certs/example.pem'));

if ($cert === false) {
    echo 'Zertifikat konnte nicht gelesen werden.';
    exit;
}

// Öffentlichen Schlüssel aus dem Zertifikat extrahieren
$publicKey = openssl_pkey_get_public($cert);

if ($publicKey === false) {
    echo 'Fehler: ' . openssl_error_string();
    exit;
}

// Details des Schlüssels ausgeben
$keyDetails = openssl_pkey_get_details($publicKey);
echo 'Schlüsseltyp: ' . ($keyDetails['type'] === OPENSSL_KEYTYPE_RSA ? 'RSA' : 'Anderer') . PHP_EOL;
echo 'Schlüssellänge: ' . $keyDetails['bits'] . ' Bit' . PHP_EOL;
Schlüsseltyp: RSA Schlüssellänge: 2048 Bit

Signatur mit öffentlichem Schlüssel verifizieren

<?php
$publicKeyPem = file_get_contents('file:///var/keys/public.pem');
$publicKey = openssl_pkey_get_public($publicKeyPem);

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

$data = 'Zu prüfende Nachricht';
$signature = file_get_contents('/var/keys/signature.bin');

$result = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);

if ($result === 1) {
    echo 'Signatur ist gültig.';
} elseif ($result === 0) {
    echo 'Signatur ist UNGÜLTIG.';
} else {
    echo 'Fehler bei der Verifikation: ' . openssl_error_string();
}
Signatur ist gültig.

// Wichtig · Fallstricke

Sicherheitshinweis: Stellen Sie immer sicher, dass der öffentliche Schlüssel aus einer vertrauenswürdigen Quelle stammt. Ein Angreifer, der einen manipulierten öffentlichen Schlüssel einschleusen kann, könnte Verschlüsselungen aufheben oder gefälschte Signaturen als gültig erscheinen lassen.

PHP 8.0: Ab PHP 8.0 wird anstelle einer internen OpenSSL-Ressource ein OpenSSLAsymmetricKey-Objekt zurückgegeben. Der explizite Aufruf von openssl_pkey_free() ist in PHP 8.0+ nicht mehr notwendig und wird als veraltet betrachtet.

Fehlerbehandlung: Bei einem Rückgabewert von false sollte immer openssl_error_string() aufgerufen werden, um die Ursache des Fehlers zu ermitteln. Häufige Ursachen sind ungültige PEM-Formate, abgelaufene Zertifikate oder fehlende Dateipfade.

Dateipfade: Beim Laden eines Schlüssels aus einer Datei muss der Pfad zwingend mit dem Präfix file:// versehen werden, z. B. file:///var/keys/public.pem. Ohne dieses Präfix wird der String als direkter PEM-Inhalt interpretiert.