Moderní tvorba webových aplikací

O webu

HTML značka <keygen>

K čemu sloužila HTML značka <keygen>.

7 minut

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ě:

Vykreslení keygen značky

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é pole
  • challenge – výzva pro podpis certifikátu
  • keytype – 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

Příklad WebAuthn

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

Související články

Odeslání formuláře tlačítkem mimo něj

Jak odeslat formulář tlačítkem, které je mimo formulář.

3 minuty

Resetování <input type=file>

Jak resetovat (odstranit) hodnotu z <input>u pro upload souborů.

3 minuty

HTML značka <input>

Všechny varianty značky <input>, možné atributy, vysvětlení a ukázky.

13 minut

Atribut autocapitalize

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

6 minut

Web jecas.cz píše Bohumil Jahoda, kontakt
Seznam všech článků
2013–2025