Etiqueta HTML <keygen>
La etiqueta HTML <keygen> es obsoleta y fue eliminada de los navegadores. Aprende qué hacía, sus atributos y el reemplazo moderno con Web Crypto API.
La etiqueta <keygen> era un elemento HTML asociado a formularios que se utilizaba para generar un par de claves pública/privada para la inscripción de certificados de cliente. Desde entonces ha sido obsoleta y eliminada del estándar HTML y de todos los navegadores modernos, por lo que ya no funciona en ningún lugar. Esta página documenta lo que hacía y qué usar en su lugar.
<keygen> es obsoleta. Fue eliminada de la especificación HTML y abandonada por todos los navegadores principales (aproximadamente entre 2017 y 2020). No hace nada en los navegadores actuales y no debe usarse en páginas nuevas. Para generar claves criptográficas en el navegador, utiliza la Web Cryptography API (crypto.subtle.generateKey()) — consulta la sección Qué usar en su lugar a continuación.
Qué hacía
Cuando se enviaba un formulario que contenía un elemento <keygen>, el navegador:
- Generaba un nuevo par de claves pública/privada en el dispositivo del usuario.
- Almacenaba la clave privada en el almacén de claves local (el llavero del navegador o del sistema operativo); nunca salía del dispositivo.
- Enviaba la clave pública al servidor, empaquetada como una cadena
SignedPublicKeyAndChallenge(SPKAC), junto con el resto de los datos del formulario.
El servidor podía entonces usar esa clave pública para emitir un certificado de cliente, vinculándolo a la clave que el usuario conservaba localmente. Todo el mecanismo existía para dar soporte a la inscripción de certificados de cliente — una forma para que un sitio web aprovisionara un certificado TLS de cliente en el navegador del usuario.
Esto tenía que ver con el aprovisionamiento de claves/certificados para la autenticación, no con la firma de documentos.
Ejemplo de la etiqueta 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>La etiqueta <keygen> se colocaba dentro de un contenedor <form> y no requería una etiqueta de cierre.
Compatibilidad con navegadores
- Chrome, Edge, Firefox, Safari, Opera: Eliminado. Todos los navegadores principales eliminaron el soporte para
<keygen>; se ignora si aparece en el marcado actual. - Navegadores móviles: No compatible.
Qué usar en su lugar
<keygen> fue obsoleta porque su función pasó a JavaScript. El reemplazo técnico directo para generar un par de claves en el navegador es la Web Cryptography API, específicamente crypto.subtle.generateKey(). Otorga a los scripts un control detallado sobre el algoritmo, los usos de la clave y si la clave es exportable — nada de lo cual ofrecía <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);Para la autenticación de usuarios en términos más generales, las aplicaciones modernas utilizan la Web Authentication API (WebAuthn) — el estándar detrás de las passkeys y las llaves de seguridad de hardware — en lugar de la inscripción de certificados de cliente mediante <keygen>.
Nota: protocolos como OAuth y OpenID Connect resuelven un problema diferente (autorización delegada e inicio de sesión). No son un reemplazo para la generación de claves criptográficas que realizaba
<keygen>.
Atributos (obsoletos)
Estos atributos estaban definidos para <keygen> mientras formaba parte de la especificación. Se enumeran solo como referencia — el elemento y todos sus atributos son obsoletos.
| Atributo | Valor | Descripción |
|---|---|---|
| autofocus | autofocus | Especificaba que el elemento recibe automáticamente el foco cuando se cargaba la página. |
| challenge | string | Una cadena de desafío empaquetada con la clave pública (en el SPKAC) cuando se enviaba el formulario. Por defecto era una cadena vacía si se omitía. |
| disabled | disabled | Deshabilitaba el elemento <keygen>. |
| form | form_id | Asociaba el elemento con un formulario específico mediante su id, permitiéndole estar fuera de ese formulario en el marcado. |
| keytype | rsa, dsa, ec | El algoritmo de clave. rsa era el único valor compatible de forma consistente (y el predeterminado); dsa y ec nunca se implementaron de manera fiable. |
| name | string | El nombre enviado con la clave pública generada. |
La etiqueta <keygen> también admitía los Atributos Globales y los Atributos de Evento.
Elementos obsoletos relacionados
<keygen> es uno de varios elementos que han sido eliminados de HTML. Consulta la lista completa de etiquetas HTML obsoletas y el elemento <form> con el que estaba diseñado para trabajar.