HTML <keygen>-Tag
Das HTML <keygen>-Element ist veraltet und aus Browsern entfernt. Erfahren Sie, was es tat, seine alten Attribute und den modernen Web Crypto API-Ersatz.
Das <keygen>-Tag war ein HTML-formularbezogenes Element, das zur Erzeugung eines öffentlichen/privaten Schlüsselpaars für die Client-Zertifikat-Registrierung verwendet wurde. Es wurde seitdem als veraltet markiert und aus dem HTML-Standard sowie aus allen modernen Browsern entfernt, sodass es nirgendwo mehr funktioniert. Diese Seite dokumentiert, was es tat und was stattdessen verwendet werden sollte.
<keygen> ist veraltet. Es wurde aus der HTML-Spezifikation entfernt und von jedem großen Browser aufgegeben (um 2017–2020). Es tut nichts in aktuellen Browsern und darf in neuen Seiten nicht verwendet werden. Zum Erzeugen kryptografischer Schlüssel im Browser verwenden Sie stattdessen die Web Cryptography API (crypto.subtle.generateKey()) — siehe den Abschnitt Was stattdessen verwenden weiter unten.
Was es tat
Wenn ein Formular mit einem <keygen>-Element abgesendet wurde, hat der Browser:
- Ein neues öffentliches/privates Schlüsselpaar auf dem Gerät des Benutzers generiert.
- Den privaten Schlüssel im lokalen Schlüsselspeicher (dem Browser- oder Betriebssystem-Schlüsselbund) gespeichert; er verließ das Gerät nie.
- Den öffentlichen Schlüssel an den Server gesendet, verpackt als
SignedPublicKeyAndChallenge-String (SPKAC), zusammen mit den restlichen Formulardaten.
Der Server konnte diesen öffentlichen Schlüssel dann verwenden, um ein Client-Zertifikat auszustellen und es an den Schlüssel zu binden, den der Benutzer lokal aufbewahrte. Der gesamte Mechanismus existierte zur Unterstützung der Client-Zertifikat-Registrierung — eine Möglichkeit für eine Website, ein TLS-Client-Zertifikat in den Browser des Benutzers bereitzustellen.
Es ging hierbei um die Bereitstellung von Schlüsseln/Zertifikaten zur Authentifizierung, nicht um die Unterzeichnung von Dokumenten.
Beispiel des (veralteten) HTML-<keygen>-Tags
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
</head>
<body>
<!-- This element no longer works in any modern browser. -->
<form action="/form/submit" method="post">
<keygen name="rsaPublicKey" keytype="rsa">
User's name:
<input type="text" name="usr_name" />
<input type="submit" />
</form>
</body>
</html>Das <keygen>-Tag wurde innerhalb eines <form>-Containers platziert und benötigte kein schließendes Tag.
Browser-Unterstützung
- Chrome, Edge, Firefox, Safari, Opera: Entfernt. Alle großen Browser haben die Unterstützung für
<keygen>eingestellt; es wird ignoriert, wenn es heute im Markup erscheint. - Mobile Browser: Nicht unterstützt.
Was stattdessen verwenden
<keygen> wurde als veraltet markiert, weil seine Aufgabe in JavaScript überführt wurde. Der direkte technische Ersatz zum Generieren eines Schlüsselpaars im Browser ist die Web Cryptography API, insbesondere crypto.subtle.generateKey(). Sie gibt Skripten feinkörnige Kontrolle über den Algorithmus, die Schlüsselverwendungen und ob der Schlüssel exportierbar ist — nichts davon bot <keygen>.
// Generate an RSA key pair with the Web Crypto API.
const keyPair = await crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 2048,
publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 65537
hash: "SHA-256",
},
true, // keys can be exported
["sign", "verify"] // allowed operations
);
// Export the public key to send it to the server.
const publicKey = await crypto.subtle.exportKey("spki", keyPair.publicKey);Für die Benutzer-Authentifizierung im weiteren Sinne verwenden moderne Anwendungen die Web Authentication API (WebAuthn) — den Standard hinter Passkeys und Hardware-Sicherheitsschlüsseln — anstelle der Client-Zertifikat-Registrierung über <keygen>.
Hinweis: Protokolle wie OAuth und OpenID Connect lösen ein anderes Problem (delegierte Autorisierung und Anmeldung). Sie sind kein Ersatz für die kryptografische Schlüsselgenerierung, die
<keygen>durchführte.
Attribute (veraltet)
Diese Attribute wurden für <keygen> definiert, während es Teil der Spezifikation war. Sie sind nur zur Referenz aufgeführt — das Element und alle seine Attribute sind veraltet.
| Attribut | Wert | Beschreibung |
|---|---|---|
| autofocus | autofocus | Gab an, dass das Element beim Laden der Seite automatisch den Fokus erhält. |
| challenge | string | Ein Challenge-string, der beim Absenden des Formulars mit dem öffentlichen Schlüssel (im SPKAC) verpackt wird. Standardmäßig ein leerer string, wenn nicht angegeben. |
| disabled | disabled | Deaktivierte das <keygen>-Element. |
| form | form_id | Verknüpfte das Element mit einem bestimmten Formular anhand seiner id, sodass es sich außerhalb dieses Formulars im Markup befinden konnte. |
| keytype | rsa, dsa, ec | Der Schlüsselalgorithmus. rsa war der einzige konsistent unterstützte Wert (und der Standard); dsa und ec wurden nie zuverlässig implementiert. |
| name | string | Der Name, der mit dem generierten öffentlichen Schlüssel übermittelt wird. |
Das <keygen>-Tag unterstützte auch die Globalen Attribute und die Ereignis-Attribute.
Verwandte veraltete Elemente
<keygen> ist eines von mehreren Elementen, die aus HTML entfernt wurden. Weitere Informationen finden Sie in der vollständigen Liste der veralteten HTML-Tags und dem <form>-Element, mit dem es zusammenarbeiten sollte.