Подключаем Рутокен ЭЦП к OpenSSL

UPDATE. Готовое решение для электронной подписи в браузере — Рутокен Плагин

Как известно, OpenSSL версии 1.0.0 и старше поддерживает российские криптоалгоритмы ГОСТ, причем поддержка этих алгоритмов полнофункциональна: реализованы подпись и шифрование в форматах PKCS#7, CMS, S/MIME в соответствии с российскими стандартами и RFC; протокол TLS с поддержкой российских шифрсьютов и т.п.

Таким образом, OpenSSL полностью совместим с проприетарными средствами криптозащиты российских производителей.

Для поддержки ГОСТов в него добавлен специальный «плагин» — engine gost. Вместе с тем существуют криптографические USB-токены с аппартной реализацией российских криптоалгоритмов на «борту». Примером такого токена является Рутокен ЭЦП, который, кстати сказать, сертифицирован как СКЗИ по классу КС2. Рутокен ЭЦП можно подключить к OpenSSL таким образом, что криптографические операции будут делаться на «борту» токена.

Для Рутокен ЭЦП имеется специальный кроссплатформенный плагин к OpenSSL — engine pkcs11_gost, который позволяет использовать аппаратную релизацию ГОСТов через стандартный интерфейс OpenSSL.

Здесь опишу, как это делается на win32.

1. OpenSSL можно взять отсюда www.slproweb.com/products/Win32OpenSSL.html. При установке в диалоге “Select Additional Tasks” следует выбрать “The OpenSSL” binaries (/bin) directory”.

2. Плагин и требующиеся ему библиотеки можно скачать по ссылке www.rutoken.ru/download/software/forum/pkcs11-gost-win32-4.2.0.zip.

3. Содержимое архива следует скопировать в папку установки OpenSSL/bin. При этом конфиг openssl. cfg надо заменить, так как в архиве содержится конфиг заточенный на использование engine pkcs11_gost.

4. Затем запускаем cmd.exe (ну или кому что нравится) и указываем в переменных окружения наш конфиг SET OPENSSL_CONF=полный путь к файлу конфигурации openssl.cfg.

5. Теперь нужно установить драйвера Рутокен, подключить к компьютеру Рутокен ЭЦП и отформатировать его через Панель управления->Панель управления Рутокен.

Используя утилиту openssl.exe пройдем путь, который позволит нам подписать файл. При этом криптографические операции (а здесь используются генерация ключа и электронная подпись) будут производиться «на борту» Рутокен ЭЦП.

1. Сгенерим ключ подписи ГОСТ Р 34.10-2001:

openssl genpkey -engine pkcs11_gost -algorithm GOST2001 -pkeyopt slot_key_id:50 -pkeyopt paramset:A -pkeyopt pin:12345678

2. Cоздадим заявку на сертификат в формате PKCS#10 для созданного ключа:

openssl req -engine pkcs11_gost -new -key 50 -keyform engine -out req.csr

3. Создадим самоподписанный корневой сертификат, для того чтобы выдать пользовательский сертификат на заявку. Для начала сгенерируем внутри токена ключ УЦ:

openssl genpkey -engine pkcs11_gost -algorithm GOST2001 -pkeyopt slot_key_id:100 -pkeyopt paramset:A -pkeyopt pin:12345678

Затем сами себе выдадим корневой сертификат для этого ключа:

openssl req -engine pkcs11_gost -x509 -new -key 100 -keyform engine -out ca.crt

4. Выпустим сертификат по заявке, полученной на шаге 2. Для этого в папке установки OpenSSL/bin создадим папку demoCA, в которой создадим папку newcerts. В папке demoCA создадим пустой файл index.txt и файл serial, в котором напишем 01. Это позволит нам вести учет выданных сертификатов. Команда выдачи сертификата:

openssl ca -engine pkcs11_gost -keyfile 100 -keyform engine -cert ca.crt -in req.csr -out tester.crt

5. Подпишем произвольный файл “присоединенной” подписью в формате S/MIME:

openssl smime -engine pkcs11_gost -sign -in [имя файла] -out [подписанный файл] -nodetach -binary -signer tester.crt -inkey 50 -keyform engine

в формате PKCS#7:

openssl smime -engine pkcs11_gost -sign -in [имя файла] -out [подписанный файл] -nodetach -binary -signer tester.crt -inkey 50 -keyform engine -outform PEM

в формате CMS:

openssl cms -engine pkcs11_gost -sign -in [имя файла] -out [подписанный файл] -nodetach -binary -signer tester.crt -inkey 50 -keyform engine -outform PEM

Более детальное описание использования OpenSSL с Рутокен ЭЦП можно найти на странице forum.rutoken.ru/topic/1639.
Поделиться публикацией
Комментарии 8
    0
    А зачем это нужно?
      +1
      Если ключи хранить в файлах — их могут украсть. Другой вариант кражи ключа — непосредственно при использовании из оперативной памяти компьютера.

      А если генерить ключ на «борту» Рутокен ЭЦП (средствами микроконтроллера, который находится внутри Рутокен ЭЦП), а потом все криптографические операции с ним проводить так же на «борту» Рутокен ЭЦП, то ключ вообще невозможно украсть. Никак.

      А интеграция с OpenSSL позволяет поддерживать сертификаты, PKI, PKCS, CMS и т.п. криптографические форматы данных.
        0
        Я как раз имел в виду поддержку OpenSSL, а не сами токены с ЭЦП. :)
        Я имел лишь небольшой опыт с ЭЦП и что-то не могу представить чем может пригодиться здесь OpenSSL.
        Можете привести пример использования? Буду благодарен.
          +1
          Собственно в самом посте есть пример выработки ЭЦП под файлом с помощью утилиты openssl.exe. А вообще OpenSSL — это и библиотека, которая предоставляет API, посредством которого можно прикрутить ЭЦП к любому приложению. Например, на форуме forum.rutoken.ru/topic/1639/, если вы обратили внимание, имеется пример программы на языке C, в котором с помощью OpenSSL подписывается файл.
          Посредством java-апплета через JNI можно прикрутить ЭЦП на базе OpenSSL и Рутокен ЭЦП к сайту.
      +1
      Собственно в самом посте есть пример выработки ЭЦП под файлом с помощью утилиты openssl.exe. А вообще OpenSSL — это и библиотека, которая предоставляет API, посредством которого можно прикрутить ЭЦП к любому приложению. Например, на форуме forum.rutoken.ru/topic/1639/, если вы обратили внимание, имеется пример программы на языке C, в котором с помощью OpenSSL подписывается файл.
      Посредством java-апплета через JNI можно прикрутить ЭЦП на базе OpenSSL и Рутокен ЭЦП к сайту.
        0
        Какова скоростные характеристики этого решения, хватит ли производительности контроллера хотя бы для обслуживания двух-трех десятков коннектов в секунду при использовании OpenSSL в качестве криптодвижка для nginx?
          0
          Очень интересный вопрос. Вы случайно не находили ответа с тех пор?
            0
            Для TLS на сервере у них вон целые двухюнитные специализированые серваки в стойку есть: https://www.cryptopro.ru/products/hsm/cryptopro-hsm

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое