W3docs

HTML <keygen> тег

Тег HTML <keygen> устарел и удалён из браузеров. Узнайте, что он делал, его атрибуты и замену — Web Crypto API.

Тег <keygen> был HTML-элементом, связанным с формой, и использовался для генерации пары открытого/закрытого ключей при регистрации клиентского сертификата. С тех пор он устарел и удалён из стандарта HTML и из всех современных браузеров, поэтому он больше нигде не работает. На этой странице описывается, что он делал и что использовать вместо него.

Опасно

<keygen> устарел. Он был удалён из спецификации HTML и исключён из всех основных браузеров (приблизительно в 2017–2020 годах). В современных браузерах он ничего не делает и не должен использоваться на новых страницах. Для генерации криптографических ключей в браузере используйте Web Cryptography API (crypto.subtle.generateKey()) — см. раздел Что использовать вместо него ниже.

Что он делал

Когда отправлялась форма, содержащая элемент <keygen>, браузер:

  1. Генерировал новую пару открытого/закрытого ключей на устройстве пользователя.
  2. Сохранял закрытый ключ в локальном хранилище ключей (связке ключей браузера или ОС); он никогда не покидал устройство.
  3. Отправлял открытый ключ на сервер в виде строки SignedPublicKeyAndChallenge (SPKAC) вместе с остальными данными формы.

Сервер мог использовать этот открытый ключ для выдачи клиентского сертификата, привязав его к ключу, хранящемуся у пользователя локально. Весь механизм существовал для поддержки регистрации клиентского сертификата — способа предоставления веб-сайтом TLS-сертификата клиента в браузер пользователя.

Речь шла о предоставлении ключей/сертификатов для аутентификации, а не о подписании документов.

Пример (устаревшего) HTML-тега <keygen>

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

Тег <keygen> размещался внутри контейнера <form> и не требовал закрывающего тега.

Поддержка браузерами

  • Chrome, Edge, Firefox, Safari, Opera: Удалён. Все основные браузеры прекратили поддержку <keygen>; он игнорируется, если встречается в разметке сегодня.
  • Мобильные браузеры: Не поддерживается.

Что использовать вместо него

<keygen> был объявлен устаревшим потому, что его задача перешла в JavaScript. Прямой технической заменой для генерации пары ключей в браузере является Web Cryptography API, в частности crypto.subtle.generateKey(). Он даёт скриптам детальный контроль над алгоритмом, областями применения ключей и возможностью их экспорта — ничего из этого <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);

Для более широкой аутентификации пользователей современные приложения используют Web Authentication API (WebAuthn) — стандарт, лежащий в основе passkey и аппаратных ключей безопасности, — а не регистрацию клиентского сертификата через <keygen>.

Примечание: такие протоколы, как OAuth и OpenID Connect, решают другую задачу (делегированная авторизация и вход в систему). Они не являются заменой криптографической генерации ключей, которую выполнял <keygen>.

Атрибуты (устаревшие)

Эти атрибуты были определены для <keygen> во время его включения в спецификацию. Они приведены только для справки — элемент и все его атрибуты устарели.

АтрибутЗначениеОписание
autofocusautofocusУказывал, что элемент автоматически получает фокус при загрузке страницы.
challengestringСтрока challenge, упакованная вместе с открытым ключом (в SPKAC) при отправке формы. По умолчанию принимала значение пустой строки, если не указана.
disableddisabledОтключал элемент <keygen>.
formform_idСвязывал элемент с определённой формой по её id, позволяя размещать его вне этой формы в разметке.
keytypersa, dsa, ecАлгоритм ключа. Значение rsa было единственным стабильно поддерживаемым (и использовалось по умолчанию); dsa и ec так и не получили надёжной реализации.
namestringИмя, отправляемое вместе со сгенерированным открытым ключом.

Тег <keygen> также поддерживал глобальные атрибуты и атрибуты событий.

Связанные устаревшие элементы

<keygen> — один из нескольких элементов, удалённых из HTML. Смотрите полный список устаревших HTML-тегов и элемент <form>, с которым он был предназначен работать.

Практика

Практика
Какое утверждение об элементе HTML keygen является верным?
Какое утверждение об элементе HTML keygen является верным?
Was this page helpful?