Терминология:
- Рутокен Web плагин Специализированный плагин только для устройств Рутокен Web. Разработка фактически прекращена в 2016 году.
- Рутокен Плагин Плагин для основной линейки устройств Рутокен, включая ЭЦП 2.0, PINPad, ЭЦП PKI. Активно разрабатывается, рекомендован для всех устройств.
Покажем, как перейти на новый плагин, если у вас встроена поддержка Рутокен Web и используется Рутокен Web плагин и серверная часть, работающая с данными, сгенерированными плагином. Предложенная схема позволит минимально изменить клиентский код и не затрагивать серверный. В результате мы получим возможность использовать всю линейку продуктов Рутокен, работающих с Рутокен Плагином и сохраним возможность работы с устройствами Рутокен Web.
Для примера возьмем демонстрационный сайт php.rutokenweb.ru. Код серверной части соответственно на php. Для других языков математика аналогична. Схему аутентификации с использованием Рутокен-WEB и сам сайт с исходниками партнеры брали за базовый вариант и дорабатывали свои решения на ее основе. Поэтому покажем процесс перехода на примере апдейта данного сайта.
Кратко о схеме, предложенной для аутентификации с Рутокен-web:
1. Зарегистрированный клиент генерирует ключевую пару, сохраняет открытый ключ на сайте.
2. При логине запрашиваются случайные данные для подписи. Данные сохраняются на сервре в сессии и отправляются клиенту.
3. Клиент получает данные, генерирует соль, добавляется к данным, результат подписывается на сгенерированном в п.1 ключе и вместе с солью отправляется на сервер для проверки.
3. Сервер производит аналогичную процедуру с солью и сохраненными в п.2 данными и проверяет корректность подписи, принимая решение об успешности аутентификации.
Соответственно нет заморочек с сертификатами, только подпись данных и проверка корректности. Подпись производим по ГОСТ Р 34.10-2001.
Схема работ по замене плагина.
- Устанавливаем Рутокен Плагин
- Меняем загрузчик плагина на нужный нам.
Заменяем на страницах или в вашей системе сборки скрипт rutokenweb.js на rutoken.js.
https://www.npmjs.com/package/rutoken
Оба скрипта используют Promise. Если у вас уже был установлен и работал (в ie) rutokenweb.js, то зависимость уже есть, но проверить стоит. Если нет, установите скрипт для работы с промисами, например этот https://github.com/jakearchibald/es6-promise - Используем модуль проверки совместимости плагина и браузера
https://www.npmjs.com/package/rutoken-browser-check. Опционально, позволяет удобно локализовать проблемы при инициализации. У скрипта есть зависимость- https://www.npmjs.com/package/bowser - Меняем логику инициализации работы с плагином. Вынес в отдельный файл boot.js, чтобы не копипастить. Подключим его на всех страницах, где нужно, уберем лишние переменные, удалим функцию token_refresh из подписки на onload страницы.
В общем случае, плагин получается в финальном resolve цепочки промисов, где мы передаем его конструктору нашей обертки вместе с методом получения пин-кода. Этот метод нужен, чтобы эмулировать отображение окна со списком логинов и обработать выбор конкретного id. Возвращает промис с id устройства и pin-кодом, введенным пользователем.
Все ошибки инициализации прилетают в reject промиса. Ошибки от плагина прилетают другие, поэтому места, где они обрабатывались, так же нужно поправить. - Используем обертку над плагином rtwToCrypto.js.
Код обертки: https://github.com/blade-runner/rutokenweb-to-plugin
Мы подменяем методы рутокенвэб на нужные нам, таким образом сигнатуры сохраняются и ваш код работает, как и работал, но с новым плагином и всеми устройствами Рутокен.
Список методов, переопределенных оберткой:
rtwIsTokenPresentAndOK
rtwGetNumberOfContainers
rtwGetContainerName
rtwSign
rtwGenKeyPair