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