W3docs

Balise HTML <keygen>

La balise HTML <keygen> est obsolète et supprimée des navigateurs. Découvrez son rôle, ses anciens attributs et le remplacement moderne avec l'API Web Crypto.

La balise <keygen> était un élément HTML associé à un formulaire, utilisé pour générer une paire de clés publique/privée dans le cadre de l'inscription à un certificat client. Elle a depuis été dépréciée et supprimée de la norme HTML ainsi que de tous les navigateurs modernes, et ne fonctionne donc plus nulle part. Cette page documente ce qu'elle faisait et ce qu'il convient d'utiliser à la place.

Danger

<keygen> est obsolète. Elle a été retirée de la spécification HTML et abandonnée par tous les principaux navigateurs (vers 2017–2020). Elle ne fait rien dans les navigateurs actuels et ne doit pas être utilisée dans de nouvelles pages. Pour générer des clés cryptographiques dans le navigateur, utilisez plutôt l'API Web Cryptography (crypto.subtle.generateKey()) — consultez la section Que utiliser à la place ci-dessous.

Ce qu'elle faisait

Lorsqu'un formulaire contenant un élément <keygen> était soumis, le navigateur :

  1. Générait une nouvelle paire de clés publique/privée sur l'appareil de l'utilisateur.
  2. Stockait la clé privée dans le trousseau de clés local (le trousseau du navigateur ou du système d'exploitation) ; elle ne quittait jamais l'appareil.
  3. Envoyait la clé publique au serveur, conditionnée sous forme de chaîne SignedPublicKeyAndChallenge (SPKAC), accompagnée du reste des données du formulaire.

Le serveur pouvait ensuite utiliser cette clé publique pour émettre un certificat client, en le liant à la clé conservée localement par l'utilisateur. Tout ce mécanisme existait pour prendre en charge l'inscription à un certificat client — une manière pour un site web de provisionner un certificat client TLS dans le navigateur de l'utilisateur.

Il s'agissait de provisionner des clés/certificats à des fins d'authentification, et non de signer des documents.

Exemple de la balise HTML <keygen> (obsolète)

<!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 balise <keygen> était placée à l'intérieur d'un conteneur <form> et ne nécessitait pas de balise de fermeture.

Compatibilité avec les navigateurs

  • Chrome, Edge, Firefox, Safari, Opera : Supprimé. Tous les principaux navigateurs ont abandonné la prise en charge de <keygen> ; elle est ignorée si elle apparaît dans le balisage aujourd'hui.
  • Navigateurs mobiles : Non pris en charge.

Que utiliser à la place

<keygen> a été dépréciée parce que son rôle a été transféré à JavaScript. Le remplacement technique direct pour générer une paire de clés dans le navigateur est l'API Web Cryptography, plus précisément crypto.subtle.generateKey(). Elle offre aux scripts un contrôle précis sur l'algorithme, les usages des clés et si la clé est exportable — rien de tout cela n'était possible avec <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);

Pour l'authentification des utilisateurs de manière plus générale, les applications modernes utilisent l'API Web Authentication (WebAuthn) — la norme derrière les clés d'accès et les clés de sécurité matérielles — plutôt que l'inscription à un certificat client via <keygen>.

Remarque : les protocoles tels qu'OAuth et OpenID Connect résolvent un problème différent (autorisation déléguée et connexion). Ils ne constituent pas un remplacement pour la génération de clés cryptographiques qu'effectuait <keygen>.

Attributs (obsolètes)

Ces attributs étaient définis pour <keygen> lorsqu'elle faisait partie de la spécification. Ils sont listés à titre de référence uniquement — l'élément et tous ses attributs sont obsolètes.

AttributValeurDescription
autofocusautofocusIndiquait que l'élément recevait automatiquement le focus lors du chargement de la page.
challengestringUne chaîne de défi conditionnée avec la clé publique (dans le SPKAC) lors de la soumission du formulaire. Valeur par défaut : une chaîne vide si omise.
disableddisabledDésactivait l'élément <keygen>.
formform_idAssociait l'élément à un formulaire spécifique via son id, lui permettant d'être placé en dehors de ce formulaire dans le balisage.
keytypersa, dsa, ecL'algorithme de clé. rsa était la seule valeur prise en charge de manière cohérente (et la valeur par défaut) ; dsa et ec n'ont jamais été implémentées de façon fiable.
namestringLe nom soumis avec la clé publique générée.

La balise <keygen> prenait également en charge les Attributs globaux et les Attributs d'événement.

Éléments obsolètes connexes

<keygen> fait partie de plusieurs éléments qui ont été supprimés de HTML. Consultez la liste complète des balises HTML dépréciées et l'élément <form> avec lequel elle était conçue pour fonctionner.

Pratique

Pratique
Quelle affirmation concernant l'élément HTML keygen est correcte ?
Quelle affirmation concernant l'élément HTML keygen est correcte ?
Was this page helpful?