HTML <keygen> тег
Тег HTML <keygen> устарел и удалён из браузеров. Узнайте, что он делал, его атрибуты и замену — Web Crypto API.
Тег <keygen> был HTML-элементом, связанным с формой, и использовался для генерации пары открытого/закрытого ключей при регистрации клиентского сертификата. С тех пор он устарел и удалён из стандарта HTML и из всех современных браузеров, поэтому он больше нигде не работает. На этой странице описывается, что он делал и что использовать вместо него.
<keygen> устарел. Он был удалён из спецификации HTML и исключён из всех основных браузеров (приблизительно в 2017–2020 годах). В современных браузерах он ничего не делает и не должен использоваться на новых страницах. Для генерации криптографических ключей в браузере используйте Web Cryptography API (crypto.subtle.generateKey()) — см. раздел Что использовать вместо него ниже.
Что он делал
Когда отправлялась форма, содержащая элемент <keygen>, браузер:
- Генерировал новую пару открытого/закрытого ключей на устройстве пользователя.
- Сохранял закрытый ключ в локальном хранилище ключей (связке ключей браузера или ОС); он никогда не покидал устройство.
- Отправлял открытый ключ на сервер в виде строки
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> во время его включения в спецификацию. Они приведены только для справки — элемент и все его атрибуты устарели.
| Атрибут | Значение | Описание |
|---|---|---|
| autofocus | autofocus | Указывал, что элемент автоматически получает фокус при загрузке страницы. |
| challenge | string | Строка challenge, упакованная вместе с открытым ключом (в SPKAC) при отправке формы. По умолчанию принимала значение пустой строки, если не указана. |
| disabled | disabled | Отключал элемент <keygen>. |
| form | form_id | Связывал элемент с определённой формой по её id, позволяя размещать его вне этой формы в разметке. |
| keytype | rsa, dsa, ec | Алгоритм ключа. Значение rsa было единственным стабильно поддерживаемым (и использовалось по умолчанию); dsa и ec так и не получили надёжной реализации. |
| name | string | Имя, отправляемое вместе со сгенерированным открытым ключом. |
Тег <keygen> также поддерживал глобальные атрибуты и атрибуты событий.
Связанные устаревшие элементы
<keygen> — один из нескольких элементов, удалённых из HTML. Смотрите полный список устаревших HTML-тегов и элемент <form>, с которым он был предназначен работать.