Start · Sprachen · PHP · Referenz · openssl_spki_export

openssl_spki_export

Funktion

Exportiert den öffentlichen Schlüssel aus einem SPKAC (Signed Public Key and Challenge) als PEM-formatierten String.

seit PHP 5.6.0 Kategorie: crypto

Signatur

openssl_spki_export(string $spki): string|false

Beschreibung

openssl_spki_export() extrahiert den öffentlichen Schlüssel aus einer SPKAC-Zeichenkette und gibt ihn im PEM-Format zurück. SPKAC (Signed Public Key and Challenge) ist ein Format, das ursprünglich von Netscape entwickelt wurde und in HTML5 durch das <keygen>-Element verwendet wird, um clientseitig ein Schlüsselpaar zu erzeugen und den öffentlichen Schlüssel zusammen mit einer signierten Challenge an den Server zu übermitteln.

Der zurückgegebene PEM-String enthält ausschließlich den öffentlichen Schlüssel (kein Zertifikat), der anschließend z. B. für die Ausstellung eines Zertifikats, zur Signaturprüfung oder zur weiteren Verarbeitung genutzt werden kann.

Der $spki-Parameter erwartet die rohe Base64-kodierte SPKAC-Zeichenkette, ohne das Präfix SPKAC=, das typischerweise in HTML-Formulardaten enthalten ist. Vor dem Aufruf sollte dieses Präfix ggf. entfernt werden.

Die Funktion ist besonders in PKI-Szenarien nützlich, in denen der Server einen vom Browser generierten öffentlichen Schlüssel extrahieren und weiterverarbeiten möchte, etwa beim Ausstellen von Client-Zertifikaten.

Parameter

Name Typ Default Beschreibung
$spki Pflicht string Die Base64-kodierte SPKAC-Zeichenkette, aus der der öffentliche Schlüssel extrahiert werden soll. Das Präfix SPKAC= darf nicht enthalten sein.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den extrahierten öffentlichen Schlüssel als PEM-formatierten String zurück. Im Fehlerfall (z. B. ungültige oder beschädigte SPKAC-Eingabe) wird false zurückgegeben.

Beispiele

Öffentlichen Schlüssel aus SPKAC extrahieren

<?php
// Beispiel: SPKAC-Wert, wie er aus einem HTML-Formular (<keygen>) übermittelt wird
// Das Präfix "SPKAC=" wird zunächst entfernt
$rawSpkac = $_POST['pubkey'] ?? '';
$spki = str_replace('SPKAC=', '', $rawSpkac);

$pemPublicKey = openssl_spki_export($spki);

if ($pemPublicKey === false) {
    echo 'Fehler: Ungültiges SPKAC-Format.';
} else {
    echo "Extrahierter öffentlicher Schlüssel (PEM):\n";
    echo $pemPublicKey;
}
Extrahierter öffentlicher Schlüssel (PEM): -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... -----END PUBLIC KEY-----

Kombination mit openssl_spki_verify zur Validierung

<?php
// SPKAC-Daten aus Formular empfangen
$rawSpkac = 'MIIBXjCByDCBsDAN...(Base64-kodiert)...';
$challenge = 'meine-challenge-zeichenkette';

// Zuerst Signatur verifizieren
if (openssl_spki_verify($rawSpkac, $challenge)) {
    // Öffentlichen Schlüssel exportieren
    $pem = openssl_spki_export($rawSpkac);
    if ($pem !== false) {
        // Schlüssel in Datei speichern oder weiterverarbeiten
        file_put_contents('/tmp/client_pubkey.pem', $pem);
        echo "Öffentlicher Schlüssel erfolgreich gespeichert.\n";
    } else {
        echo "Export des öffentlichen Schlüssels fehlgeschlagen.\n";
    }
} else {
    echo "SPKAC-Signatur ungültig.\n";
}
Öffentlicher Schlüssel erfolgreich gespeichert.

// Wichtig · Fallstricke

Deprecation-Hinweis: Das HTML5-Element <keygen>, das SPKAC-Daten erzeugt, ist als veraltet markiert und wird von modernen Browsern nicht mehr unterstützt. Damit ist auch der primäre Anwendungsfall für openssl_spki_export() in neuen Projekten weitgehend entfallen. Für neue Implementierungen sollten modernere Verfahren wie Web Crypto API oder Zertifikatsanfragen via CSR bevorzugt werden.

Eingabevalidierung: Nutzereingaben (z. B. aus $_POST) sollten nie ohne Prüfung an OpenSSL-Funktionen übergeben werden. Kombiniere den Export stets mit openssl_spki_verify(), um die Integrität der SPKAC-Daten sicherzustellen.

Bei Fehlern gibt die Funktion false zurück. Detailliertere Fehlermeldungen können über openssl_error_string() abgerufen werden.