W3docs

Tag HTML <keygen>

A tag HTML <keygen> é obsoleta e removida dos navegadores. Saiba o que ela fazia, seus atributos antigos e a substituição pela Web Crypto API.

A tag <keygen> era um elemento HTML associado a formulários, usado para gerar um par de chaves pública/privada para registro de certificado de cliente. Ela foi descontinuada e removida do padrão HTML e de todos os navegadores modernos, portanto não funciona mais em nenhum ambiente. Esta página documenta o que ela fazia e o que usar em seu lugar.

Perigo

<keygen> é obsoleta. Ela foi removida da especificação HTML e abandonada por todos os principais navegadores (por volta de 2017–2020). Não faz nada nos navegadores atuais e não deve ser usada em novas páginas. Para gerar chaves criptográficas no navegador, use a Web Cryptography API (crypto.subtle.generateKey()) — veja a seção O que usar em seu lugar abaixo.

O que ela fazia

Quando um formulário contendo um elemento <keygen> era enviado, o navegador:

  1. Gerava um novo par de chaves pública/privada no dispositivo do usuário.
  2. Armazenava a chave privada no repositório de chaves local (o chaveiro do navegador ou do sistema operacional); ela nunca saía do dispositivo.
  3. Enviava a chave pública ao servidor, empacotada como uma string SignedPublicKeyAndChallenge (SPKAC), junto com os demais dados do formulário.

O servidor podia então usar essa chave pública para emitir um certificado de cliente, vinculando-o à chave que o usuário mantinha localmente. Todo o mecanismo existia para suportar o registro de certificado de cliente — uma forma de um site provisionar um certificado TLS de cliente no navegador do usuário.

Isso era sobre provisionamento de chaves/certificados para autenticação, não sobre assinatura de documentos.

Exemplo da tag HTML <keygen> (obsoleta)

<!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>

A tag <keygen> era colocada dentro de um contêiner <form> e não exigia uma tag de fechamento.

Suporte a Navegadores

  • Chrome, Edge, Firefox, Safari, Opera: Removido. Todos os principais navegadores abandonaram o suporte a <keygen>; ela é ignorada caso apareça na marcação hoje.
  • Navegadores Móveis: Sem suporte.

O que usar em seu lugar

<keygen> foi descontinuada porque sua função migrou para o JavaScript. A substituição técnica direta para gerar um par de chaves no navegador é a Web Cryptography API, especificamente crypto.subtle.generateKey(). Ela oferece aos scripts controle detalhado sobre o algoritmo, os usos da chave e se a chave é exportável — nada que <keygen> oferecia.

// 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);

Para autenticação de usuários de forma mais ampla, as aplicações modernas usam a Web Authentication API (WebAuthn) — o padrão por trás das passkeys e das chaves de segurança físicas — em vez do registro de certificado de cliente via <keygen>.

Nota: protocolos como OAuth e OpenID Connect resolvem um problema diferente (autorização delegada e login). Eles não são uma substituição para a geração de chaves criptográficas que <keygen> realizava.

Atributos (obsoletos)

Estes atributos foram definidos para <keygen> enquanto ela fazia parte da especificação. Eles estão listados apenas para referência — o elemento e todos os seus atributos são obsoletos.

AtributoValorDescrição
autofocusautofocusEspecificava que o elemento recebe foco automaticamente quando a página era carregada.
challengestringUma string de desafio empacotada com a chave pública (no SPKAC) quando o formulário era enviado. Assumia o valor de string vazia se omitido.
disableddisabledDesativava o elemento <keygen>.
formform_idAssociava o elemento a um formulário específico pelo seu id, permitindo que ele ficasse fora desse formulário na marcação.
keytypersa, dsa, ecO algoritmo da chave. rsa era o único valor com suporte consistente (e o padrão); dsa e ec nunca foram implementados de forma confiável.
namestringO nome enviado com a chave pública gerada.

A tag <keygen> também suportava os Atributos Globais e os Atributos de Evento.

Elementos obsoletos relacionados

<keygen> é um dos vários elementos que foram removidos do HTML. Veja a lista completa de tags HTML obsoletas e o elemento <form> com o qual ela foi projetada para funcionar.

Prática

Prática
Qual afirmação sobre o elemento keygen do HTML está correta?
Qual afirmação sobre o elemento keygen do HTML está correta?
Was this page helpful?