Signatur
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
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;
}
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";
}
// 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.