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.
<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:
- Gerava um novo par de chaves pública/privada no dispositivo do usuário.
- Armazenava a chave privada no repositório de chaves local (o chaveiro do navegador ou do sistema operacional); ela nunca saía do dispositivo.
- 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.
| Atributo | Valor | Descrição |
|---|---|---|
| autofocus | autofocus | Especificava que o elemento recebe foco automaticamente quando a página era carregada. |
| challenge | string | Uma 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. |
| disabled | disabled | Desativava o elemento <keygen>. |
| form | form_id | Associava o elemento a um formulário específico pelo seu id, permitindo que ele ficasse fora desse formulário na marcação. |
| keytype | rsa, dsa, ec | O 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. |
| name | string | O 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.