Signatur
Beschreibung
openssl_get_publickey() ist ein vollständiger Alias der Funktion openssl_pkey_get_public(). Die Funktion extrahiert bzw. lädt einen öffentlichen Schlüssel aus unterschiedlichen Quellen und stellt ihn als OpenSSLAsymmetricKey-Objekt zur Verfügung, das anschließend für asymmetrische Verschlüsselungs-, Entschlüsselungs- und Verifizierungsoperationen genutzt werden kann.
Als Eingabe werden verschiedene Formate akzeptiert: ein bereits vorhandenes OpenSSLAsymmetricKey- oder OpenSSLCertificate-Objekt, ein PEM-kodierter Schlüssel-String, ein Dateipfad in der Form file://pfad/zum/schluessel.pem oder ein Array mit einem Zertifikat und einem Passwort. Dies macht die Funktion sehr flexibel in der Praxis.
In modernem PHP-Code (ab PHP 8.0) empfiehlt sich die direkte Verwendung von openssl_pkey_get_public(), da diese Funktion den primären Namen trägt. Der Alias openssl_get_publickey() ist jedoch vollständig äquivalent und kann ohne Bedenken eingesetzt werden, sofern Abwärtskompatibilität gewünscht ist.
Nach der Nutzung des Schlüssels in PHP-Versionen vor 8.0 sollte der Schlüssel mit openssl_free_key() freigegeben werden. Ab PHP 8.0 erfolgt die Speicherbereinigung automatisch, wenn das Objekt den Gültigkeitsbereich verlässt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $public_key Pflicht | OpenSSLAsymmetricKey|OpenSSLCertificate|array|string | Der öffentliche Schlüssel in einem der unterstützten Formate: ein OpenSSLAsymmetricKey- oder OpenSSLCertificate-Objekt, ein PEM-kodierter Schlüssel als String, ein Dateipfad im Format file:///pfad/schluessel.pem oder ein Array der Form [$zertifikat, $passwort] für passwortgeschützte Schlüssel. |
Rückgabewert
OpenSSLAsymmetricKey-Objekt zurück, das den extrahierten öffentlichen Schlüssel repräsentiert. Im Fehlerfall (z. B. ungültiger Schlüssel oder nicht lesbarer Dateipfad) wird false zurückgegeben.Beispiele
Öffentlichen Schlüssel aus PEM-String laden und zur Verschlüsselung nutzen
<?php
$pemPublicKey = <<<EOT
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2a2rwplBQLF29amygykE
MmYz0+Kcj3bKBp29Fk9uqrAMwDMzLFHSHFoEsJZbYgsSckN7FEoGLOBMAANbwMK
...
-----END PUBLIC KEY-----
EOT;
$publicKey = openssl_get_publickey($pemPublicKey);
if ($publicKey === false) {
echo 'Fehler beim Laden des öffentlichen Schlüssels.';
exit;
}
$nachricht = 'Geheime Nachricht';
$verschluesselt = '';
if (openssl_public_encrypt($nachricht, $verschluesselt, $publicKey)) {
echo 'Verschlüsselung erfolgreich. Länge: ' . strlen($verschluesselt) . ' Bytes';
} else {
echo 'Verschlüsselung fehlgeschlagen.';
}
// Ab PHP 8.0 automatische Freigabe; vorher:
// openssl_free_key($publicKey);
Öffentlichen Schlüssel aus einer PEM-Datei laden
<?php
// Schlüssel aus Datei laden
$publicKey = openssl_get_publickey('file:///var/keys/public.pem');
if ($publicKey === false) {
$fehler = openssl_error_string();
throw new RuntimeException('Schlüssel konnte nicht geladen werden: ' . $fehler);
}
// Schlüssel-Details ausgeben
$details = openssl_pkey_get_details($publicKey);
echo 'Schlüsseltyp: ' . $details['type'] . PHP_EOL;
echo 'Schlüssellänge (Bits): ' . $details['bits'] . PHP_EOL;
// Wichtig · Fallstricke
Alias-Hinweis: Da openssl_get_publickey() ein Alias von openssl_pkey_get_public() ist, sind beide Funktionen vollständig austauschbar. Für neue Projekte wird die Verwendung von openssl_pkey_get_public() empfohlen, da Aliasse in zukünftigen PHP-Versionen theoretisch entfernt werden könnten.
Sicherheitshinweis: Stellen Sie sicher, dass öffentliche Schlüssel aus vertrauenswürdigen Quellen stammen. Ein kompromittierter öffentlicher Schlüssel führt dazu, dass Daten für den Angreifer verschlüsselt werden. Validieren Sie Zertifikate mithilfe von Zertifikatsketten und openssl_x509_verify().
Fehlerbehandlung: Im Fehlerfall gibt die Funktion false zurück. Weitere Fehlerinformationen sind über openssl_error_string() abrufbar. Prüfen Sie den Rückgabewert stets mit === false.
PHP 8.0+: Ab PHP 8.0 gibt die Funktion ein OpenSSLAsymmetricKey-Objekt zurück. In früheren Versionen wurde eine resource zurückgegeben. Der explizite Aufruf von openssl_free_key() ist ab PHP 8.0 nicht mehr notwendig.