Start · Sprachen · PHP · Referenz · openssl_spki_verify

openssl_spki_verify

Funktion

Überprüft die Signatur eines SPKAC (Signed Public Key and Challenge) und gibt <code>true</code> zurück, wenn die Signatur gültig ist.

seit PHP 5.6.0 Kategorie: crypto

Signatur

openssl_spki_verify(string $spki): bool

Beschreibung

openssl_spki_verify() prüft, ob ein übergebener SPKAC-String (Signed Public Key and Challenge) eine gültige Signatur enthält. SPKAC ist ein Format, das ursprünglich von Netscape entwickelt wurde und typischerweise beim HTML-Element <keygen> verwendet wird, um einen öffentlichen Schlüssel zusammen mit einer signierten Challenge an einen Server zu übermitteln.

Die Funktion überprüft dabei, ob der im SPKAC enthaltene öffentliche Schlüssel tatsächlich zur privaten Signatur passt – also ob das SPKAC integer und nicht manipuliert ist. Dies ist ein wichtiger Schritt, bevor ein Server auf Basis des SPKAC ein Zertifikat ausstellt.

Der $spki-Parameter muss der rohe, Base64-kodierte SPKAC-String sein, der typischerweise aus einem HTML-Formular stammt. Er sollte vor der Übergabe an diese Funktion bereinigt, aber nicht dekodiert werden. Andere nützliche Begleitfunktionen sind openssl_spki_export() zum Extrahieren des öffentlichen Schlüssels und openssl_spki_export_challenge() zum Auslesen der Challenge.

Gibt die Funktion false zurück, deutet dies auf eine ungültige oder beschädigte Signatur hin, und das SPKAC sollte abgelehnt werden.

Parameter

Name Typ Default Beschreibung
$spki Pflicht string Der Base64-kodierte SPKAC-String, dessen Signatur geprüft werden soll. Enthält den öffentlichen Schlüssel sowie eine signierte Challenge. Leerzeichen und Zeilenumbrüche werden automatisch entfernt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Signatur des SPKAC gültig ist, andernfalls false. Bei ungültigem Eingabeformat wird ebenfalls false zurückgegeben und eine entsprechende Fehlermeldung erzeugt.

Beispiele

Grundlegende Überprüfung eines SPKAC aus einem HTML-Formular

<?php
// Simulierter SPKAC-String aus einem HTML-<keygen>-Formular
$spkac = $_POST['pubkey'] ?? '';

// Eingabe bereinigen (nur alphanumerisch und Base64-Zeichen)
$spkac = preg_replace('/[^a-zA-Z0-9+\/=]/', '', $spkac);

if (empty($spkac)) {
    die('Kein SPKAC übermittelt.');
}

if (openssl_spki_verify($spkac)) {
    echo 'SPKAC-Signatur ist gültig.' . PHP_EOL;

    // Öffentlichen Schlüssel extrahieren
    $pubKey = openssl_spki_export($spkac);
    echo 'Öffentlicher Schlüssel:' . PHP_EOL . $pubKey . PHP_EOL;

    // Challenge auslesen
    $challenge = openssl_spki_export_challenge($spkac);
    echo 'Challenge: ' . $challenge . PHP_EOL;
} else {
    echo 'SPKAC-Signatur ist UNGÜLTIG – Anfrage wird abgelehnt.' . PHP_EOL;
}
SPKAC-Signatur ist gültig. Öffentlicher Schlüssel: -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- Challenge: meine-challenge

SPKAC generieren und direkt verifizieren

<?php
// Neues RSA-Schlüsselpaar erzeugen
$privateKey = openssl_pkey_new([
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

if ($privateKey === false) {
    die('Schlüsselerzeugung fehlgeschlagen: ' . openssl_error_string());
}

$challenge = 'test-challenge-123';

// SPKAC erzeugen
$spkac = openssl_spki_new($privateKey, $challenge);

if ($spkac === false) {
    die('SPKAC-Erzeugung fehlgeschlagen: ' . openssl_error_string());
}

echo 'SPKAC erzeugt.' . PHP_EOL;

// Prefix "SPKAC=" entfernen, falls vorhanden
$spkacRaw = preg_replace('/^SPKAC=/', '', $spkac);

// Signatur verifizieren
if (openssl_spki_verify($spkacRaw)) {
    echo 'Signatur erfolgreich verifiziert.' . PHP_EOL;
} else {
    echo 'Verifikation fehlgeschlagen.' . PHP_EOL;
    echo openssl_error_string() . PHP_EOL;
}
SPKAC erzeugt. Signatur erfolgreich verifiziert.

// Wichtig · Fallstricke

Sicherheitshinweis: Bevor openssl_spki_verify() aufgerufen wird, sollte der SPKAC-String stets bereinigt und auf unerwartete Zeichen geprüft werden. Ein positives Ergebnis garantiert nur die kryptografische Integrität der Signatur – nicht die Vertrauenswürdigkeit des Absenders.

Präfix beachten: Manche Implementierungen senden den SPKAC mit einem vorangestellten SPKAC=-Präfix. Dieser muss vor der Übergabe entfernt werden, da die Funktion andernfalls false zurückgibt.

Deprecation: Das HTML-Element <keygen>, das typischerweise SPKACs erzeugt, ist in modernen Browsern veraltet und wurde aus dem HTML-Standard entfernt. SPKAC wird daher hauptsächlich noch in speziellen PKI- und Zertifikatsanwendungen eingesetzt.

Im Fehlerfall können Details über openssl_error_string() abgerufen werden.