Start · Sprachen · PHP · Referenz · openssl_spki_export_challenge

openssl_spki_export_challenge

Funktion

Exportiert die Challenge-Zeichenkette aus einem signierten Public-Key-Zertifikat mit Challenge (SPKAC).

seit PHP 5.6.0 Kategorie: crypto

Signatur

openssl_spki_export_challenge(string $spki): string|false

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

Typ
string|false
Beschreibung
Gibt die Challenge-Zeichenkette als 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');
}
?>
Challenge: meine-challenge-zeichenkette

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.