Опыт применения технологии Рутокен для регистрации и авторизации пользователей в системе (часть 4)
Итак, мы разобрались, каким образом будет происходить аутентификация пользователей в системе, а так же создали свой локальный удостоверяющий центр с корневым приватным ключом и корневым сертификатом. Теперь пора перейти к работе непосредственно с Рутокеном. Напомню, что работать мы будем с Рутокеном из клиентской части приложения через Рутокен плагин.
Надеюсь, что драйвера для Рутокена и Рутокен плагин уже установлены на вашем компьютере. Если нет, то предлагаю еще раз ознакомиться с первой частью статьи.
Если вы начнете читать документацию, то у вас может возникнуть вопрос (по крайней мере так было у меня). Что за объект такой plugin? Где его взять, чтобы потом применять к нему всякого рода функции из документации. Разбираясь с данной проблемой, я совершенно случайно попал на эту страницу
Там есть пример кода, как раз из которого у меня и удалось получить этот самый объект.
Тут приведу код, который тупо надо скопировать к себе, после чего вы сможете работать с документацией:
Чтобы успешно использовать Рутокен плагин и вообще понимать, как работает этот код, нужно разобраться, что такое Promise. Есть отличная статья на эту тему, в которой имеется все что нужно для понимания Promise.
Напомню, что для нашей задачи необходимо сначала создать ключевую пару на Рутокене, а затем сформировать запрос на сертификат, который после этого будет отправлен на сервер для получения сертификата.
Для написания своих клиентский приложения я использую фреймворк Ext Js, но это абсолютно не важно. Уверен, что понять весь этот код можно и без знания Ext Js.
Перейдем к реализации. Для начала нужно получить соединение с Рутокеном. Для этого был создан класс, который будет за это отвечать:
Для работы с этим классом просто нужно создать его объект, а потом вызвать функцию connectToDevice. В результате эта функция возвращает список, состоящий из плагина и номера первого Рутокена. Функция connectToDevice принимает параметр rutoken. Этот объект получается копированием части содержимого кода, приведенного в начале статьи:
Таким образом, нужно создать объект данного класса и подставить его в функцию connectToDevice класса Rutoken.rutoken.ConnectToDevice, код которого был приведен ранее. Это действие я делаю в следующем классе, который отвечает за регистрацию пользователя:
В качестве параметров функция registration получает объекты классов Rutoken.rutoken.RutokenInit (rutoken), Rutoken.rutoken.ConnectToDevice (device), третьим параметром передается scope на ViewController, чтобы у меня была возможность работать с данными с формы (рассмотрение данной части выходит за рамки статьи).
Считаю, что код имеет достаточное количество комментариев, чтобы можно было понять, как он работает. Обращу внимание только на некоторые моменты.
Во-первых, обратите внимание на часть кода помеченную комментарием «Формируем запрос createPkcs10 на выдачу сертификата». Рассмотрим переменную subject. Она представляет собой ассоциативный массив, который содержит в себе данные пользователя. Эти данные потом будут отражаться в самом сертификате. Дело в том, что по умолчанию можно менять только значения этого массива, но нельзя добавлять новые или удалять старые элементы этого массива. Обратите на это внимание, иначе ваша функция для создания запроса работать не будет.
Во-вторых, хочу обратить внимание на то, что алгоритм, с помощью которого формируется ключевая пара (в моем случае PUBLIC_KEY_ALGORITHM_GOST3410_2012_256), должен соответствовать алгоритму хеширования в переменной options (в моем случае это «hashAlgorithm»: plugin.HASH_TYPE_GOST3411_12_256). Если будете использовать другой алгоритм создания ключевой пары, то алгоритм хеширования должен быть соответствующий. В противном случае ваша функция для создания запроса также работать не будет.
После формирования запроса на создание сертификата, происходит отправка этого запроса на сервер, и в ответ приходит сам сертификат, который успешно импортируется на Рутокен.
Отлично! Мы произвели регистрацию пользователя в системе. Теперь мы имеем на своем Рутокене сертификат с неэкспортируемой ключевой парой, а также удостоверяющий центр знает о сертификате, который записан на Рутокене, так как он сам его выдал с помощью первой команды, описанной в данной статье.
Перейдем к авторизации пользователя. Алгоритм процесса авторизации описан тут.
Для программного описания процесса авторизации мной был создан класс Rutoken.rutoken.RutokenAuthorization:
В результате мы получим объект authorizationSuccess с логическим значением, которое говорит о том, что прошла ли наша авторизация успешно или нет.
В заключение приведу полезную ссылку, которая поможет вам протестировать работоспособность функций Рутокен плагина.
Надеюсь, этот цикл статей был полезен для вас, желаю удачи и спасибо за внимание!
Сертификат с неэкспортируемой ключевой парой рутокен что это
Какой именно токен выбрать?
Выбор токена зависит от того, как он будет сгенерирован на устройство и как в дальнейшем будет работать.
Рассмотрим разновидности ключей электронной подписи в связке с токенами от компании Актив — Рутокен.
1. Извлекаемые ключи ЭП — создаются с помощью программного криптопровайдера (КриптоПРО CSP). Закрытый ключ хранится в защищённом ключевом контейнере на токене. Вся работа с ключами производится средствами этого программного криптопровайдера. При этом, во время операций с подписью, после ввода правильного PIN-кода, закрытый ключ ненадолго извлекается в оперативную память компьютера.
2. Неизвлекаемые ключи ЭП — создаются с использованием аппаратных возможностей устройства Рутокен (СКЗИ на токене). Такие ключи ЭП хранятся не просто в защищённом ключевом контейнере, но и в специальном внутреннем формате. При работе с подписью все операции производятся внутри токена — закрытый ключ никогда не выдается наружу.
Извлекаемые ключи делятся на:
Этот параметр устанавливается во время генерации контейнера или при импорте ключей. Впоследствии этот параметр уже не изменить.
В том случае, если ключ генерируется на флешку, жесткий диск или в реестр компьютера, запрет экспорта особо не ограничивает возможность копирования контейнера. Вы можете скопировать контейнер средствами ОС.
А вот запись неэкспортируемого контейнера на Рутокен, позволяет вам защититься от копирования контейнера средствами ОС и криптопровайдера.
Неизвлекаемые ключи делятся на два вида:
Какие бывают модели Рутокен? ⠀
Аппаратная криптография на токене не равно вшитая в токен программа КриптоПро CSP. То есть если вы получили модель Рутокен с записанным на нее извлекаемым контейнером формата КриптоПро или с ключами формата ФКН, то вне зависимости от того какая у вас модель Рутокен — пассивная или активная, для работы с таким типом ключей, нужно будет приобрести лицензию на КриптоПро CSP.
Рассмотрим с помощью каких средств криптографической защиты информации можно сгенерировать извлекаемые ключи.
Есть 3 варианта:
-
версии 4.0 и выше. При генерации нужно выбрать «режим CSP». Тогда ключи будут генерироваться с использованием программного криптопровайдера на любую модель Рутокен.
- В случае с остальными двумя вариантами: при использовании в качестве средства генерации VipNet CSP или Signal-COM CSP, важно какую модель вы используете. С пассивными носителями Рутокен Lite и Рутокен S — будет автоматически использоваться программная генерация извлекаемых ключей
Неизвлекаемые ключи формата PKCS#11 можно сгенерировать с использованием активных токенов из линейки Рутокен ЭЦП 2.0 и 3.0. Именно эти две линейки содержат в себе возможности аппаратной криптографии.
Для генерации можно использовать инструмент от компании Актив — это Рутокен SDK , или воспользоваться инструментами, которые выпускают наши партнеры. Если речь идет о КриптоПро CSP, то ключи формата PKCS#11 можно сгенерировать с помощью версии 5.0 R2 и выше.
На устройства из линеек ЭЦП 2.0 или 3.0 всегда генерируются только неизвлекаемые ключи с использованием аппаратной криптографии Рутокена.
Для того, чтобы сгенерировать ключи ФКН с защитой канала нужно использовать устройство Рутокен ЭЦП 2.0 3000 или токены из линейки Рутокен ЭЦП 3.0 — именно в этих моделях добавлена возможность генерации и работы с такими ключами. Важно так же что для ключей такого формата подойдет версия КриптоПро CSP 5.0 и выше.
Криптография «на борту». Неизвлекаемые ключевые носители
Электронная подпись (ЭП) – неотъемлемая часть современного документооборота. Ведение современного бизнеса просто невозможно представить без ее использования. ЭП помогает идентифицировать автора подписанного документа, определить, вносились ли изменения в документ после его подписания, а также обеспечивает юридическую значимость подписанного документа. Электронная подпись также решает множество задач частных лиц, избавляя от бумажной волокиты и делая их повседневную жизнь проще.
Для того, чтобы начать пользоваться всеми благами электронной подписи, вам понадобится приобрести ключевой носитель (токен или смарт-карту), получить сертификат электронной подписи, а также в некоторых случаях установить специальное криптографическое программное обеспечение, отвечающее за генерацию ключевой пары (ключа подписи и ключа проверки подписи). Такое ПО может быть установлено на компьютер самостоятельно или в Удостоверяющем центре (УЦ), выдающем сертификаты электронной подписи, а может быть частью самого ключевого носителя, выполняя криптографические операции прямо “на борту” устройства — токена или смарт-карты. Давайте разберемся, почему последний вариант должен быть более предпочтителен для пользователя.
Как мы уже писали ранее — во избежание компрометации вашей электронной подписи сохранить в тайне ключ ЭП чрезвычайно важно! Безопасность ключей подписи зависит от свойств экспортируемости и извлекаемости, а также функциональных возможностей токена или смарт-карты, на которых они хранятся. Поэтому в качестве носителей ключей электронной подписи рекомендуется использовать защищенные активные ключевые носители (например, Рутокен ЭЦП 2.0 2100) со встроенными на аппаратном уровне функциями средства криптографической защиты информации. Достаточно подробно о разнице активных и пассивных ключевых носителей мы рассказали в материале Что такое компрометация ключа ЭП и почему она происходит. В данной статье мы подробнее остановимся на свойствах активных ключевых носителей или, другими словами, криптографических ключевых носителей.
Неэкспортируемые ключи подписи обладают более высокой степенью защищенности по сравнению с экспортируемыми ключами. Однако оба эти типа ключей относятся к извлекаемым ключам. При формировании электронной подписи такие ключи после предъявления PIN-кода считываются в оперативную память компьютера.
Разница состоит в том, что записанный на ключевой носитель неэкспортируемый ключ не получится скопировать штатными средствами средства криптографической защиты информации. Специалисты по информационной безопасности рекомендуют использовать неэкспортируемые ключи, так как получение доступа к такому ключу требует применения специальных средств и техники.
Свойство экспортируемости или неэкспортируемости ключа подписи присваивается на этапе формирования ключа подписи и записи его на защищенный ключевой носитель.
Свойство неизвлекаемости ключа подписи достигается тогда, когда его хранение и использование происходит только в специальной и защищенной микропроцессором области памяти ключевого носителя. Доступ к защищенной памяти осуществляется с помощью нередактируемого перечня команд микропроцессора. Важно, что процессор при этом не содержит команды, позволяющей получить доступ извне к содержанию ключа. Для обеспечения свойства неизвлекаемости ключа подписи используются только активные ключевые носители, содержащие в себе аппаратно реализованные функции средства криптографической защиты информации (СКЗИ), при использовании которых генерируется и используется неизвлекаемый ключ.
Применение неизвлекаемых ключей подписи на активном ключевом носителе обеспечивает максимальную степень их защиты.
Неизвлекаемый ключ подписи на активном ключевом носителе хранится в его памяти, в защищенном ключевом контейнере, в специальном внутреннем формате. В таком ключевом носителе отсутствует возможность чтения ключей подписи программными средствами, а значит не может появится и копии (путем клонирования) ключа пользователя вне микропроцессора устройства.
Все это означает, что у такого носителя появляется ряд технических преимуществ перед пассивным защищенным ключевым носителем:
1) генерация ключа подписи происходит на самом носителе с использованием аппаратных криптографических функций ключевого носителя;
2) при подписании электронного документа ключ подписи не копируется в память компьютера – подписание электронного документа происходит в самом ключевом носителе.
Ключ подписи никогда не покидает такой ключевой носитель, поэтому его компрометация возможна только в случае хищения ключевого носителя вместе с паролем (PIN-кодом).
Активный защищенный ключевой носитель (криптографический ключевой носитель) обладает гораздо более высоким уровнем защищенности от атак злоумышленников по сравнению с пассивными ключевыми носителями. Чтобы не потеряться во множестве вариантов устройств, прочитайте нашу статью Какой токен нужен для налоговой.
Сертификат с неэкспортируемой ключевой парой рутокен что это
Добрый день уважаемые читатели и подписчики блога Pyatilistnik.org, сегодня я хочу с вами поделиться опытом вот в таком вопросе, есть токен на котором записана ЭЦП, но проблема в том, что ее можно экспортировать, а это с точки зрения безопасности не очень хорошо, так как не совсем честный сотрудник или человек, может ее выгрузить и использовать в своих целях, я вас научу, как запретить экспорт закрытого ключа с рутокен.
По умолчанию запрет на экспортируемый ключ ставится еще при создании токена, на центре сертификации. Если же там этого не сделали, то мы сделаем вот такой финт.
Установка драйверов и модуля управления Rutoken
Первым делом вам необходимо установить драйвера и софт для управления и администрирования рутокеном. Скачать его можно на официальном сайте производителя.
Далее в пуске находим «Панель управления рутокеном»
Далее в открывшейся программе, переходим на вкладку «Сертификаты». Если у вас будет предупреждение:
-
не настроен для работы
Контейнер с сертификатом поврежден
Данная ошибка, в 99 процентов случаев выскакивает из-за отсутствия или просроченной лицензии КриптоПро CSP.
После установки КриптоПро все выглядит как нужно и доступна кнопка экспорта закрытого ключа.
Запрещаем экспортирование сертификата
Производим экспорт сертификата, в итоге у вас получится архив pfx. Он будет содержать как открытый, так и закрытый ключ. Теперь попробуйте произвести импорт сертификата. Обратите внимание, что в момент импорта, вам не нужно ставить галку «Разрешить экспорт закрытого ключа» именно ей мы не дадим его выгрузку.
Вводим пинкод (чаще всего он стандартный у рутокен, если вы его не меняли)
У вас может появиться в некоторых случаях ошибка «импортированы могут быть только сертификаты для ключей RSA»
Для ее решения нам нужно преобразовать сертификат pfx. Нам потребуется утилита OpenSSL. С помощью OpenSSL экспортируем закрытый ключ из PFX-файла:
- pkcs12 -in newcert.pfx -nocerts -out encrypted.key
- Проводим те же действия с сертификатом: pkcs12 -in newcert.pfx -nokeys -out cert.pem
- Конвертируем полученные сертификат и закрытый ключ в формат DER:
OpenSSL> x509 -in cert.pem -out cert.crt -outform DER
OpenSSL> rsa -in encrypted.key -out key.der -outform DER - Записываем сконвертированный закрытый ключ на Рутокен
- Удаляем старый сертификат, после проверки нового.
Надеюсь вам поможет данный метод, запретить экспортирование приватного ключа с рутокен, если у вас есть дополнения или другие методы, то напишите о них в комментариях.