Signatur
Beschreibung
SPKAC (Signed Public Key and Challenge) ist ein Dateiformat, das ursprünglich von Netscape entwickelt wurde und häufig in HTML-Formularen mit dem <keygen>-Element verwendet wird. Es enthält einen öffentlichen Schlüssel sowie eine Challenge-Zeichenkette, die während der Schlüsselgenerierung angegeben werden kann.
openssl_spki_export_challenge() extrahiert ausschließlich den Challenge-Anteil aus einer gültigen SPKAC-Struktur. Die Challenge ist eine beliebige Zeichenkette, die der Browser (oder die generierende Anwendung) als Teil des SPKAC-Datensatzes signiert hat und die dem Server ermöglicht, die Authentizität des Schlüssels zu überprüfen.
Die Funktion ist nützlich, wenn man SPKAC-Daten aus Zertifikatsregistrierungsworkflows verarbeitet und die Challenge-Zeichenkette zur Validierung oder Protokollierung auslesen möchte, ohne den gesamten Datensatz manuell zu parsen.
Typische Anwendungsfälle sind serverseitige Verarbeitung von <keygen>-Formulardaten oder die Verifikation von SPKAC-Strukturen in Zertifikatsverwaltungssystemen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $spki Pflicht | string | Eine gültige SPKAC-Struktur als Zeichenkette, typischerweise Base64-kodiert, wie sie etwa aus einem HTML-<keygen>-Formularfeld stammt. |
Rückgabewert
string zurück, wenn die SPKAC-Struktur gültig und die Challenge vorhanden ist. Bei einem Fehler oder einer ungültigen SPKAC-Eingabe wird false zurückgegeben.Beispiele
Challenge aus SPKAC-Formulardaten extrahieren
<?php
// SPKAC-Wert aus einem HTML-<keygen>-Feld (vereinfachtes Beispiel)
// In der Praxis kommt dieser Wert aus $_POST['pubkey']
$spkac = $_POST['pubkey'] ?? '';
if (empty($spkac)) {
die('Kein SPKAC-Wert übermittelt.');
}
$challenge = openssl_spki_export_challenge('SPKAC=' . $spkac);
if ($challenge === false) {
echo 'Ungültige SPKAC-Struktur oder keine Challenge vorhanden.';
} else {
echo 'Challenge: ' . htmlspecialchars($challenge, ENT_QUOTES, 'UTF-8');
}
?>
SPKAC validieren und Challenge protokollieren
<?php
function verarbeiteSpkac(string $spkacRaw, string $erwarteteChallenge): bool {
// SPKAC-Präfix hinzufügen, falls nicht vorhanden
$spkac = str_starts_with($spkacRaw, 'SPKAC=') ? $spkacRaw : 'SPKAC=' . $spkacRaw;
$challenge = openssl_spki_export_challenge($spkac);
if ($challenge === false) {
error_log('Ungültige SPKAC-Struktur empfangen.');
return false;
}
if (!hash_equals($erwarteteChallenge, $challenge)) {
error_log('Challenge stimmt nicht überein: ' . $challenge);
return false;
}
// Öffentlichen Schlüssel exportieren
$publicKey = openssl_spki_export($spkac);
if ($publicKey === false) {
error_log('Öffentlicher Schlüssel konnte nicht exportiert werden.');
return false;
}
echo 'Validierung erfolgreich. Öffentlicher Schlüssel akzeptiert.' . PHP_EOL;
return true;
}
// Beispielaufruf (SPKAC-Wert müsste real sein)
$ergebnis = verarbeiteSpkac('MIIBXjCByDCBsDAN...', 'session-token-12345');
var_dump($ergebnis);
?>
// Wichtig · Fallstricke
Sicherheitshinweis: Die Challenge-Zeichenkette sollte niemals direkt in HTML-Ausgaben oder SQL-Abfragen eingefügt werden, ohne zuvor korrekt escaped bzw. parametrisiert zu werden. Verwende für die Ausgabe stets htmlspecialchars() und für Datenbankzugriffe Prepared Statements.
Prefix-Beachtung: Viele SPKAC-Implementierungen erwarten, dass der übergebene String mit dem Präfix SPKAC= beginnt. Ohne diesen Präfix kann die Funktion false zurückgeben. Prüfe daher, ob das übergebene SPKAC-Datum bereits diesen Präfix enthält.
Deprecation: Das HTML-<keygen>-Element, das SPKAC-Daten erzeugt, ist in modernen Browsern veraltet und wurde entfernt. SPKAC-Verarbeitung ist daher heute vor allem in Legacy-Systemen oder spezialisierten Zertifizierungsanwendungen relevant.