Тег keygen в HTML: для чего был нужен и что пришло ему на смену

Тег <keygen> (от английского key generator, «создатель ключей») встраивали в форму, чтобы браузер сам создал пару ключей. Закрытый ключ сохранялся в браузере, а открытый уходил на сервер вместе с остальными полями формы: по нему сервер выпускал сертификат. Тег пустой: закрывающего </keygen> у него нет.

Из браузеров тег убрали, а в стандарте HTML он значится устаревшим. Сегодня keygen для браузера неизвестный тег: ключ он не создаёт и в данные формы не попадает. Новые страницы с ним писать не нужно.

HTML
<form action="/certificate" method="post">
  <keygen name="key" keytype="rsa">
  <button type="submit">Отправить</button>
</form>

Тег keygen в HTML: что это и для чего создавали

Раньше выпуск сертификата требовал отдельных программ: человек создавал ключи, отправлял заявку в центр сертификации и устанавливал ответ. Тег keygen позволял сделать это прямо в форме: браузер показывал выбор длины ключа, создавал пару и отправлял открытую часть на сервер.

Раньше у тега было шесть атрибутов. Современные браузеры их не читают.

АтрибутЧто делалЗаметка
nameназвание поля с открытым ключом при отправке формызначение уходило на сервер вместе с остальными полями
keytypeвид ключей, чаще всего rsaесли не указан, использовался rsa
challengeстрока, которую сервер просил добавить к ключу для проверкипопадала в запрос на сертификат
disabledотключал полеотключённое поле не отправлялось
formсвязывал поле с формой, которая находится в другом месте страницызначением был id формы
autofocusфокус на поле при открытии страницыединственный из шести, который остался: он глобальный

Как браузер разбирает keygen

В стандарте для keygen есть особое правило разбора: его добавляют в документ и сразу закрывают, как img или br. Поэтому тег пустой, а текст после него остаётся рядом, а не внутри. Закрывающий </keygen> ни на что не влияет.

Класс у тега HTMLUnknownElement, свойств name, challenge и keytype у него нет, а display по умолчанию inline. Пример показывает, что происходит внутри формы.

JavaScript
const k = document.querySelector("keygen");
console.log(k.constructor.name, "keytype" in k);

Пример: как браузер разбирает keygen

Результат

Кнопки меняют запись. Под ней показаны класс тега, поля формы и ключи FormData, измеренные в рамке.

Работает ли keygen сейчас

Нет. Ключи не создаются, выбор длины ключа не показывается, а при отправке формы поле с name в данные не попадает: в form.elements и в FormData остаются только настоящие поля. Тег ничего не рисует, поэтому страница выглядит так, будто его нет.

Когда keygen убрали из браузеров

Браузеры убирали тег по очереди. Для Safari данных об удалении нет.

Пример: таблица версий

БраузерУбран в версииЗаметка
Chrome57до этого тег работал
Edge79работал в старом Edge, в версии 79 браузер перешёл на Chromium
Firefox69работал с версии 1
Safariнет данныхтег был с версии 1.2

Чем заменить keygen: Web Cryptography API

Стандарт HTML советует два пути. Для настройки рабочих устройств используют средства самой системы. Для выпуска сертификата создают пару ключей через Web Cryptography API, затем выгружают сертификат и ключ, чтобы человек установил их сам.

Пару ключей создаёт метод crypto.subtle.generateKey(). Если второй аргумент равен false, закрытый ключ выгрузить нельзя: он остаётся в браузере, как и у keygen. Открытый ключ выгружает exportKey() в формате spki: так принято хранить открытые ключи. Его отправляют на сервер обычным полем формы или через fetch. Если закрытый ключ нужно перенести на другое устройство, вместо false ставят true, но тогда его может выгрузить любой скрипт страницы.

JavaScript
const keys = await crypto.subtle.generateKey(
  { name: "ECDSA", namedCurve: "P-256" },
  false,
  ["sign", "verify"]
);
const spki = await crypto.subtle.exportKey("spki", keys.publicKey);

Web Cryptography API работает только в защищённом контексте: на страницах с https и на localhost.

Пример: пара ключей через Web Crypto

Результат

Кнопки создают пару ключей. Размер открытого ключа и права на выгрузку измерены в рамке.

Частые ошибки с тегом keygen

Ошибки возникают оттого, что keygen пытаются использовать как рабочий тег или неточно переносят его работу на Web Cryptography API.

ОшибкаЧто получитсяКак исправить
<keygen name="key"> в форме в расчёте на создание ключаНичего не происходит, поле в данные формы не попадаетСоздавать ключи через crypto.subtle.generateKey()
true вторым аргументом generateKey() «на всякий случай»Закрытый ключ может выгрузить любой скрипт страницыСтавить false, если ключ должен остаться в браузере
Запуск страницы без httpscrypto.subtle недоступен, ключи не создаютсяОткрывать страницу по https или на localhost
Результат exportKey() кладут в поле формы как естьВ поле попадает строка [object ArrayBuffer], а не ключПеревести ключ в base64, как в примере выше
Категория
Поделиться в социальных сетях
Основные HTML-теги
Семантические теги HTML
Заголовки и абзацы
Теги для форматирования текста
Тег гиперссылки HTML
HTML-теги таблицы
Списки в HTML
Теги для форм
Мультимедиа и изображения
Интерактивные и служебные теги
Устаревшие HTML-теги

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×