Start · Sprachen · PHP · Referenz · openssl_csr_get_public_key

openssl_csr_get_public_key

Funktion

Extrahiert den öffentlichen Schlüssel aus einem Certificate Signing Request (CSR) und gibt ihn als <code>OpenSSLAsymmetricKey</code>-Objekt zurück.

seit PHP 5.2.0 Kategorie: crypto

Signatur

openssl_csr_get_public_key(OpenSSLCertificateSigningRequest|string $csr, bool $short_names = true): OpenSSLAsymmetricKey|false

Beschreibung

openssl_csr_get_public_key() liest den in einem CSR enthaltenen öffentlichen Schlüssel aus und gibt ihn als OpenSSLAsymmetricKey-Objekt (vor PHP 8.0 als Ressource vom Typ OpenSSL key) zurück. Dies ist z. B. nützlich, um zu prüfen, ob der öffentliche Schlüssel eines CSR mit einem vorhandenen privaten Schlüssel übereinstimmt, oder um Schlüsseleigenschaften wie Länge und Algorithmus zu inspizieren.

Der Parameter $csr akzeptiert ein OpenSSLCertificateSigningRequest-Objekt (erzeugt z. B. mit openssl_csr_new()), den PEM-kodierten CSR als String oder einen Dateipfad im Format file://pfad/zur/datei.pem.

Der zurückgegebene Schlüssel kann direkt an andere OpenSSL-Funktionen übergeben werden, etwa openssl_pkey_get_details(), um Metadaten wie Schlüssellänge und Schlüsseltyp abzufragen. Nicht mehr benötigte Schlüssel-Ressourcen sollten in PHP < 8.0 mit openssl_free_key() freigegeben werden; ab PHP 8.0 übernimmt der Garbage Collector diese Aufgabe automatisch.

Der Parameter $short_names steuert, ob die Felder des Distinguished Name in Kurzform (z. B. CN statt commonName) zurückgegeben werden. In der Praxis hat dieser Parameter auf den zurückgegebenen Schlüssel selbst keinen Einfluss, beeinflusst aber möglicherweise interne Metadaten-Verarbeitung.

Parameter

Name Typ Default Beschreibung
$csr Pflicht OpenSSLCertificateSigningRequest|string Der CSR als OpenSSLCertificateSigningRequest-Objekt, als PEM-String oder als Dateipfad im Format file://pfad/zur/datei.pem.
$short_names bool true Gibt an, ob Distinguished-Name-Felder in Kurzform zurückgegeben werden sollen (z. B. CN statt commonName). Hat in der Regel keinen praktischen Einfluss auf den extrahierten Schlüssel.

Rückgabewert

Typ
OpenSSLAsymmetricKey|false
Beschreibung
Gibt bei Erfolg ein OpenSSLAsymmetricKey-Objekt (vor PHP 8.0 eine OpenSSL-Key-Ressource) zurück, das den öffentlichen Schlüssel des CSR repräsentiert. Bei einem Fehler (z. B. ungültiger CSR) wird false zurückgegeben.

Beispiele

Öffentlichen Schlüssel aus einem CSR extrahieren und Details anzeigen

<?php
// Neuen privaten Schlüssel und CSR erzeugen
$privateKey = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

$csrConfig = [
    'countryName'            => 'DE',
    'stateOrProvinceName'    => 'Bayern',
    'localityName'           => 'München',
    'organizationName'       => 'Beispiel GmbH',
    'commonName'             => 'example.com',
    'emailAddress'           => 'admin@example.com',
];

$csr = openssl_csr_new($csrConfig, $privateKey);

// Öffentlichen Schlüssel aus dem CSR extrahieren
$publicKey = openssl_csr_get_public_key($csr);

if ($publicKey === false) {
    echo 'Fehler beim Extrahieren des öffentlichen Schlüssels.' . PHP_EOL;
} else {
    $details = openssl_pkey_get_details($publicKey);
    echo 'Schlüssellänge: ' . $details['bits'] . ' Bit' . PHP_EOL;
    echo 'Schlüsseltyp: ' . ($details['type'] === OPENSSL_KEYTYPE_RSA ? 'RSA' : 'Anderer') . PHP_EOL;
}
?>
Schlüssellänge: 2048 Bit Schlüsseltyp: RSA

CSR aus PEM-Datei laden und öffentlichen Schlüssel exportieren

<?php
// CSR aus Datei laden
$csrPem = file_get_contents('/etc/ssl/mein_antrag.csr');

$publicKey = openssl_csr_get_public_key($csrPem);

if ($publicKey !== false) {
    // Öffentlichen Schlüssel als PEM-String exportieren
    openssl_pkey_export($publicKey, $pubKeyPem);
    echo $pubKeyPem;
} else {
    echo 'Ungültiger oder nicht lesbarer CSR.' . PHP_EOL;
}
?>
-----BEGIN PUBLIC KEY----- ...(Base64-kodierter Schlüssel)... -----END PUBLIC KEY-----

// Wichtig · Fallstricke

Versionshinweis: Vor PHP 8.0 wurde der Schlüssel als Ressource vom Typ OpenSSL key zurückgegeben. Ab PHP 8.0 wird ein OpenSSLAsymmetricKey-Objekt verwendet. Code, der auf Ressourcentyp prüft (z. B. is_resource()), muss entsprechend angepasst werden.

Ressourcenverwaltung: In PHP < 8.0 sollte der zurückgegebene Schlüssel nach der Verwendung mit openssl_free_key() freigegeben werden, um Speicherlecks zu vermeiden. Ab PHP 8.0 ist dies nicht mehr nötig.

Sicherheit: Der aus einem CSR extrahierte öffentliche Schlüssel sollte vor der Verwendung auf ausreichende Schlüssellänge geprüft werden (RSA mindestens 2048 Bit, besser 4096 Bit). Zu kurze Schlüssel gelten als unsicher.