Start · Sprachen · PHP · Referenz · openssl_pkey_get_private

openssl_pkey_get_private

Funktion

Lädt einen privaten Schlüssel und gibt ein <code>OpenSSLAsymmetricKey</code>-Objekt zurück, das für kryptographische Operationen verwendet werden kann.

seit PHP 4.2.0 Kategorie: crypto

Signatur

openssl_pkey_get_private(OpenSSLAsymmetricKey|array|string $private_key, ?string $passphrase = null): OpenSSLAsymmetricKey|false

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

Typ
OpenSSLAsymmetricKey|false
Beschreibung
Gibt bei Erfolg ein 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
Signatur erzeugt: <base64-kodierter String>

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;
Schlüsseltyp: 0 Schlüssellänge (Bits): 2048

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;
}
Entschlüsselt: Geheime Nachricht

// 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 false als 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.