Signatur
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:
|
Rückgabewert
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();
}
Ö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;
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();
}
// 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.