Signatur
Beschreibung
openssl_pkey_get_private() liest einen privaten Schlüssel aus verschiedenen Quellen (PEM-String, Dateipfad oder bestehendem Schlüssel-Objekt) und stellt ihn als OpenSSLAsymmetricKey-Ressource (bzw. Objekt ab PHP 8.0) bereit. Dieses Objekt kann anschließend an Funktionen wie openssl_sign(), openssl_private_encrypt() oder openssl_private_decrypt() übergeben werden.
Der Schlüssel kann als PEM-kodierter String direkt übergeben werden oder als Dateipfad im Format file:///pfad/zum/schluessel.pem. Falls der private Schlüssel mit einer Passphrase geschützt ist, muss diese als zweiter Parameter übergeben werden, andernfalls schlägt die Funktion fehl.
Ab PHP 8.0 wurde die frühere resource-basierte Rückgabe durch ein typisiertes OpenSSLAsymmetricKey-Objekt ersetzt. Code, der explizit auf den Typ resource prüft, muss für PHP 8+ angepasst werden. Das zurückgegebene Objekt muss nicht mehr manuell freigegeben werden (früher mit openssl_free_key()), da dies der Garbage Collector übernimmt.
Diese Funktion wird typischerweise im Kontext von digitalen Signaturen, asymmetrischer Verschlüsselung, TLS-Zertifikatsverarbeitung und JWT-Erzeugung eingesetzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $private_key Pflicht | OpenSSLAsymmetricKey|array|string | Der zu ladende private Schlüssel. Kann sein: ein PEM-kodierter String, ein Dateipfad als file:///pfad/schluessel.pem, ein bestehendes OpenSSLAsymmetricKey-Objekt oder ein Array der Form [$schluessel, $passphrase]. |
|
| $passphrase | ?string | null | Optionale Passphrase zum Entschlüsseln eines passwortgeschützten privaten Schlüssels. Wird null übergeben, wird angenommen, dass der Schlüssel nicht verschlüsselt ist. |
Rückgabewert
OpenSSLAsymmetricKey-Objekt zurück (vor PHP 8.0 eine resource). Bei einem Fehler (z. B. ungültiger Schlüssel oder falsche Passphrase) wird false zurückgegeben und ein entsprechender Eintrag in den OpenSSL-Fehlerpuffer geschrieben, der mit openssl_error_string() ausgelesen werden kann.Beispiele
Privaten Schlüssel aus PEM-String laden und zum Signieren verwenden
<?php
$pemKey = <<<EOT
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7...
-----END PRIVATE KEY-----
EOT;
$privateKey = openssl_pkey_get_private($pemKey);
if ($privateKey === false) {
while ($error = openssl_error_string()) {
echo 'OpenSSL-Fehler: ' . $error . PHP_EOL;
}
exit(1);
}
$data = 'Nachricht, die signiert werden soll';
$signature = '';
if (openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {
echo 'Signatur erzeugt: ' . base64_encode($signature) . PHP_EOL;
} else {
echo 'Fehler beim Signieren.' . PHP_EOL;
}
// Ab PHP 8.0 kein openssl_free_key() mehr nötig
Passwortgeschützten privaten Schlüssel aus Datei laden
<?php
$keyFile = 'file:///var/ssl/private/server_encrypted.pem';
$passphrase = 'geheimesPasswort123';
$privateKey = openssl_pkey_get_private($keyFile, $passphrase);
if ($privateKey === false) {
echo 'Schlüssel konnte nicht geladen werden:' . PHP_EOL;
while ($msg = openssl_error_string()) {
echo ' ' . $msg . PHP_EOL;
}
exit(1);
}
// Schlüsseldetails ausgeben
$details = openssl_pkey_get_details($privateKey);
echo 'Schlüsseltyp: ' . $details['type'] . PHP_EOL;
echo 'Schlüssellänge (Bits): ' . $details['bits'] . PHP_EOL;
Privaten Schlüssel zur asymmetrischen Entschlüsselung nutzen
<?php
// Öffentlich verschlüsselten Text mit privatem Schlüssel entschlüsseln
$privateKeyPem = file_get_contents('/var/ssl/private/mykey.pem');
$privateKey = openssl_pkey_get_private($privateKeyPem);
if ($privateKey === false) {
throw new RuntimeException('Privater Schlüssel konnte nicht geladen werden.');
}
// $encryptedData wurde zuvor mit dem zugehörigen öffentlichen Schlüssel verschlüsselt
$encryptedData = base64_decode('VERSCHLÜSSELTER_BASE64_STRING');
$decryptedData = '';
if (openssl_private_decrypt($encryptedData, $decryptedData, $privateKey)) {
echo 'Entschlüsselt: ' . $decryptedData . PHP_EOL;
} else {
echo 'Entschlüsselung fehlgeschlagen.' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Private Schlüssel sollten niemals im Quellcode hartcodiert oder in öffentlich zugänglichen Verzeichnissen gespeichert werden. Verwende Umgebungsvariablen oder sichere Konfigurationsdateien außerhalb des Web-Roots.
- Passwortgeschützte Schlüssel bieten einen zusätzlichen Schutz bei Kompromittierung des Dateisystems – die Passphrase sollte jedoch nicht im Code stehen, sondern aus einem sicheren Speicher (z. B. Secrets-Manager) stammen.
- Fehlerhafte Passphrasen oder korrupte PEM-Dateien führen zu
falseals Rückgabewert, ohne eine Exception zu werfen. Prüfe den Rückgabewert immer explizit. - Ab PHP 8.0 ist
openssl_free_key()als veraltet (deprecated) markiert und muss nicht mehr aufgerufen werden. - Das Array-Format
[$schluessel, $passphrase]als erster Parameter ist eine alternative Übergabeform und entspricht dem direkten Übergeben von Schlüssel und Passphrase als zwei separate Parameter.