Start · Sprachen · PHP · Referenz · openssl_spki_new

openssl_spki_new

Funktion

Erzeugt ein neues signiertes <code>SPKAC</code> (Signed Public Key and Challenge) aus einem privaten Schlüssel, einer Challenge-Zeichenkette und einem Digest-Algorithmus.

seit PHP 5.6.0 Kategorie: crypto

Signatur

openssl_spki_new(OpenSSLAsymmetricKey $private_key, string $challenge, int $digest_algo = OPENSSL_ALGO_MD5): string|false

Beschreibung

SPKAC (Signed Public Key and Challenge) ist ein Format, das ursprünglich von Netscape entwickelt wurde und im HTML-Element <keygen> verwendet wird. Es enthält den öffentlichen Schlüssel des Clients sowie eine signierte Challenge-Zeichenkette, die vom Server überprüft werden kann. openssl_spki_new() erzeugt eine solche Struktur auf Basis eines vorhandenen privaten Schlüssels.

Der typische Einsatzbereich ist die clientseitige Schlüsselgenerierung in Web-Formularen (z. B. zur Zertifikatsausstellung), bei der der Server die Echtheit des übermittelten öffentlichen Schlüssels anhand der signierten Challenge verifizieren muss. Das zurückgegebene SPKAC-String kann danach mit Funktionen wie openssl_spki_verify() validiert oder mit openssl_spki_export() weiterverarbeitet werden.

Der $digest_algo-Parameter bestimmt den Algorithmus, der zur Signierung der Challenge verwendet wird. Standardmäßig wird OPENSSL_ALGO_MD5 genutzt, jedoch sollte aus Sicherheitsgründen ein stärkerer Algorithmus wie OPENSSL_ALGO_SHA256 bevorzugt werden, da MD5 als kryptografisch unsicher gilt.

Die Funktion gibt bei Erfolg einen Base64-kodierten SPKAC-String zurück. Schlägt die Erzeugung fehl (z. B. aufgrund eines ungültigen Schlüssels), wird false zurückgegeben.

Parameter

Name Typ Default Beschreibung
$private_key Pflicht OpenSSLAsymmetricKey Ein gültiger privater Schlüssel, der z. B. mit openssl_pkey_new() erzeugt oder mit openssl_pkey_get_private() geladen wurde. Dieser Schlüssel wird zur Signierung der Challenge verwendet.
$challenge Pflicht string Eine frei wählbare Challenge-Zeichenkette, die typischerweise vom Server vorgegeben wird und in das SPKAC eingebettet und signiert wird. Sie dient der Bindung des öffentlichen Schlüssels an eine konkrete Anfrage.
$digest_algo int OPENSSL_ALGO_MD5 Der zu verwendende Digest-Algorithmus als Integer-Konstante, z. B. OPENSSL_ALGO_MD5, OPENSSL_ALGO_SHA256 usw. Aus Sicherheitsgründen wird OPENSSL_ALGO_SHA256 empfohlen.

Rückgabewert

Typ
string|false
Beschreibung
Gibt bei Erfolg einen Base64-kodierten SPKAC-String zurück. Bei einem Fehler (z. B. ungültiger Schlüssel oder nicht unterstützter Algorithmus) wird false zurückgegeben.

Beispiele

SPKAC mit SHA-256 erzeugen und ausgeben

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

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

// Server-seitige Challenge (normalerweise zufällig)
$challenge = 'meineSicherheChallenge123';

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

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

echo 'SPKAC: ' . $spkac . PHP_EOL;
SPKAC: MIIBXjCByDCBsDAN...

SPKAC erzeugen und anschließend verifizieren

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

$challenge = bin2hex(random_bytes(16)); // Zufällige Challenge

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

if ($spkac === false) {
    die('Fehler bei der SPKAC-Erzeugung.');
}

// SPKAC verifizieren
$valid = openssl_spki_verify('SPKAC=' . $spkac);

if ($valid) {
    echo 'SPKAC erfolgreich verifiziert.' . PHP_EOL;

    // Öffentlichen Schlüssel aus SPKAC extrahieren
    $pubKey = openssl_spki_export('SPKAC=' . $spkac);
    echo 'Öffentlicher Schlüssel:' . PHP_EOL . $pubKey;
} else {
    echo 'SPKAC-Verifikation fehlgeschlagen.' . PHP_EOL;
}
SPKAC erfolgreich verifiziert. Öffentlicher Schlüssel: -----BEGIN PUBLIC KEY----- ...

// Wichtig · Fallstricke

Sicherheitshinweis: Der Standardalgorithmus OPENSSL_ALGO_MD5 gilt als kryptografisch unsicher und sollte in produktiven Umgebungen nicht verwendet werden. Nutzen Sie stattdessen mindestens OPENSSL_ALGO_SHA256.

Das HTML-Element <keygen>, das SPKAC ursprünglich in Browsern genutzt hat, ist in modernen Browsern deprecated und wurde aus den meisten Implementierungen entfernt. Die Verwendung von openssl_spki_new() im Kontext von Web-Formularen ist daher nur noch in speziellen Legacy-Szenarien sinnvoll.

Der zurückgegebene SPKAC-String enthält kein vorangestelltes SPKAC=-Präfix. Funktionen wie openssl_spki_verify() und openssl_spki_export() erwarten jedoch den vollständigen String mit dem Präfix SPKAC=.