
HTML značka <keygen>
byla navržena pro generování kryptografických klíčů přímo v prohlížeči. Jejím hlavním účelem bylo vytváření veřejných a soukromých klíčů pro asymetrické šifrování bez nutnosti server-side zpracování.
Jak fungoval keygen
Element <keygen>
vytvářel páry klíčů (veřejný a soukromý) přímo v prohlížeči:
<form method="POST">
<keygen
name="key"
challenge="...optional challenge string..."
keytype="RSA" />
<button type="submit">Submit</button>
</form>
Mohl se vykreslit následovně:
Když uživatel odeslal formulář, prohlížeč vygeneroval pár klíčů, veřejný klíč odeslal na server v SPKAC formátu (Signed Public Key And Challenge) a soukromý klíč uložil do úložiště v prohlížeči.
Web by pak mohl ověřit vaši identitu bez nutnosti zadávat heslo – stačilo by, že vlastníte ten správný soukromý klíč. Mělo to být bezpečnější než hesla, protože klíče se nedají uhodnout ani ukrást tak snadno.
SPKAC formát
SPKAC obsahuje veřejný klíč, challenge řetězec z atributu challenge
a digitální podpis vytvořený soukromým klíčem. Challenge řetězec je náhodný text, který se podepíše soukromým klíčem jako důkaz jeho vlastnictví. Data jsou kódována v Base64 a lze je dekódovat pomocí OpenSSL.
Bezpečnostní problémy SPKAC:
- Používá kryptograficky slabý MD5 pro podpisy
- Proprietární formát bez standardisace
- Server nemůže ověřit, zda klíč byl skutečně vygenerován v prohlížeči
Atributy keygen elementu
name
– název pro formulářové polechallenge
– výzva pro podpis certifikátukeytype
– typ klíče (RSA, DSA, EC)keyparams
– parametry pro generování klíče
Problémy s uživatelským rozhraním
UI problémy s <keygen>
byly závažné:
Povinné certifikáty
Když web vyžadoval klientský certifikát, uživatelé bez certifikátu dostali pouze SSL chybovou obrazovku bez možnosti zaregistrovat se. To vyžadovalo mít dvě domény:
newusers.example.com
– pro registraci nových uživatelůsecure.example.com
– vyžadující certifikát
Volitelné certifikáty
I při volitelných certifikátech byl UI podobný HTTP autentifikaci s problémy:
- Prohlížeč zobrazil dialog pro výběr certifikátu
- Neexistoval způsob „odhlášení" nebo změny certifikátu
- Uživatelé nevěděli, co je klientský certifikát
Internet Explorer a ActiveX
<keygen>
byl proprietární tag od Netscape a nikdy nebyl podporován v Internet Exploreru. Místo toho IE vyžadoval použití ActiveX objektu:
new ActiveXObject("X509Enrollment.CX509EnrollmentWebClassFactory")
Proč byl keygen zavržen
Element <keygen>
byl označen jako deprecated z několika závažných důvodů:
Bezpečnostní risika
- MD5 v SPKAC – vyžadoval použití kryptograficky nebezpečného MD5
- Trvalé modifikace OS – umožňoval uložení certifikátu do operačního systému
- Cross-origin problémy – klíče mohly ovlivnit všechny aplikace
Problémy s implementací
- Nekonsistentní implementace – každý prohlížeč implementoval
<keygen>
jinak - Microsoft IE/Edge – nikdy nepodporoval
<keygen>
tag - Nedostatečné použití
Moderní alternativy
Web Crypto API
Web Crypto API je moderní způsob, jak prohlížeč může bezpečně pracovat s šifrováním. Místo starého <keygen>
umožňuje vytvářet klíče, šifrovat zprávy a podepisovat data přímo v prohlížeči bez nutnosti posílat citlivé informace na server.
Prohlížeč může generovat různé typy klíčů, šifrovat a dešifrovat zprávy, vytvářet digitální podpisy a generovat bezpečná náhodná čísla. Vše se děje lokálně v počítači uživatele, takže data nikdy neopustí jeho zařízení.
Používá se pro bezpečnou komunikaci, ověřování identity, šifrování souborů a podobné úkoly. Je to standardní řešení, které funguje ve všech moderních prohlížečích a je mnohem bezpečnější než starý <keygen>
.
const keyPair = await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);
WebAuthn
Moderní standard pro autentifikaci pomocí hardwarových nebo virtuálních tokenů, který nahrazuje hesla a poskytuje:
- Bezpečnost – privátní klíče zůstávají v autentifikátoru
- Phishing odolnost – autentifikace je vázána na konkrétní doménu
- Biometrie – podpora otisků prstů, Face ID
- Hardware klíče – podpora YubiKey, Titan Security Key
Podpora v prohlížečích
- Chrome: Odstraněn v Chrome 67 (2018)
- Firefox: Odstraněn ve Firefox 69 (2019)
- Safari: Nikdy nepodporován
- Edge: Odstraněn s přechodem na Chromium
- Internet Explorer: Nikdy nepodporován (používal ActiveX)
Současná situace
Klientské certifikáty stále fungují v prohlížečích, ale musí být nainstalovány ručně.
Závěr
Element <keygen>
byl zajímavým experimentem v oblasti kryptografie v prohlížeči, ale kvůli bezpečnostním problémům, složitosti implementace a špatnému uživatelskému rozhraní byl nakonec opuštěn. Moderní Web Crypto API a WebAuthn poskytují mnohem lepší a bezpečnější řešení.
Odkazy jinam
- (Pre-)Intent to Deprecate – proč byl keygen zavržen
- Web Crypto API – moderní alternativa pro kryptografii v prohlížeči
- WebAuthn – standard pro bezpečnou autentifikaci
- WebAuthn Guide – praktický průvodce implementací
- Memoirs from the old web: The KEYGEN element – detailní technický popis
Související články

Odeslání formuláře tlačítkem mimo něj
Jak odeslat formulář tlačítkem, které je mimo formulář.

Resetování <input type=file>
Jak resetovat (odstranit) hodnotu z <input>
u pro upload souborů.


Atribut autocapitalize
HTML atribut autocapitalize
slouží k nastavení automatického přepnutí na velká písmena u dotykových klávesnic.