Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Statustoc
subtletrue
colourRed
titleВ работе

Table of Contents

Использование ключей на Рутокене

rtengine позволяет использовать ключи, расположенные на токене. В зависимости от операции будет выбран открытый или закрытый ключ соответственно.

Оба ключа пары должны иметь одинаковый идентификатор объекта и/или имя объекта. Ключевая пара идентифицируется с помощью pkcs11 uri.

Возможные компоненты идентификатора пути:

...

Пример идентификатора ключевой пары на токене:

...

Если подключен только один Рутокен с единственной ключевой парой, для идентификации можно использовать только модель:

...

Генерация ключевой пары в файл

Формат команды:

...

Описание параметров:

...

Название файла, в который будет записана ключевая пара. По умолчанию создается в том же каталоге, откуда была вызвана команда.

Чтобы сохранить файл в другой каталог, укажите в параметре -out  полный путь к этому каталогу, включая название файла:

-out /путь/к/файлу.pem

Генерация ключевой пары ГОСТ в файл

Пример:

...

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out privatekey.pem 

Значения параметров:

...

  • gost2001;
  • gost2012_256;
  • gost2012_512

...

  • gost2001A, B, C, XA, XB;
  • gost2012_256: A, B, C, XA, XB;
  • gost2012_512: A, B

Генерация ключевой пары ECDSA в файл

Пример: 

...

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp256r1 -out privatekey.pem 

Значения параметров:

...

EC

...

Общая информация

В данной статье описаны следующие сценарии использования Рутокена с OpenSSL:

  • генерация ключевой пары в файл с помощью алгоритмов ГОСТ, ECDSA, RSA;
  • генерация ключевой пары на токене с помощью алгоритмов ГОСТ, ECDSA, RSA;
  • просмотр записанных на токен объектов;
  • формирование запроса PKCS #10;
  • выпуск самоподписанного сертификата по запросу;
  • зашифрование и расшифрование в формате CMS;
  • подпись «сырой» подписью;
  • проверка «сырой» подписи;
  • запуск SSL/TLS клиента/сервера.

Для использования ключей с токена необходимо специальным образом указывать идентификатор ключа. Подробнее этот идентификатор описан в разделе Использование ключей на Рутокене.

Начало работы

Для выполнения описанных ниже сценариев понадобятся OpenSSL 3.0 и pkcs11-tool из состава OpenSC версии 0.25.0 или выше. pkcs11-tool используется для генерации ключевых пар на токене.

Перед тем, как приступить к работе, настройте OpenSSL и rtengine:

Использование ключей на Рутокене 
Anchor
on-token
on-token

rtengine позволяет использовать ключи, расположенные на токене. В зависимости от операции будет выбран открытый или закрытый ключ соответственно. 

Оба ключа пары должны иметь одинаковый идентификатор объекта и/или имя объекта. Ключевая пара идентифицируется с помощью pkcs11 uri.

Tip

Этот идентификатор соответствует аргументу "pkcs11:your_pkcs11_uri" в примерах команд, которые используют ключи на токене.

Возможные компоненты идентификатора пути:

КомпонентОписание
manufacturerID производителя токена
modelМодель токена
serialСерийный номер токена
tokenМетка токена(поле "label")
objectИмя объекта(CKA_LABEL)
id

Идентификатор объекта (CKA_ID)

Tip

Если ключевая пара была сгенерирована с помощью pkcs11-tool, чтобы использовать ID объекта в URI, нужно конвертировать его в ASCII. Сделать это можно с помощью онлайн-сервиса конвертации HEX в ASCII.
Например, для ключевой пары ГОСТ с "--id 3132" в PKCS #11 URI нужно указать "pkcs11:id=12". 

Пример идентификатора ключевой пары на токене:

pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;serial=2adc8d87;object=my%20label;id=%aa%bb%cc%dd?pin-value=12345678

Если подключен только один Рутокен с единственной ключевой парой, для идентификации можно использовать только модель:

pkcs11:model=Rutoken%20ECP

Генерация ключевой пары в файл

Формат команды:

openssl genpkey -algorithm alg -pkeyopt opt:value [-pkeyopt opt:value]... -out filename.pem

Описание параметров:

ПараметрОписание
algorithmАлгоритм шифрования
-pkeyopt

Настройки алгоритма (размер ключа, тип эллиптической кривой, и т.д.). Задает для параметра алгоритма opt значение value.

Может быть использован несколько раз, если у алгоритма есть несколько изменяемых параметров. Например:

openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3
-out

Название файла, в который будет записана ключевая пара. По умолчанию создается в том же каталоге, откуда была вызвана команда.

Чтобы сохранить файл в другой каталог, укажите в параметре -out  полный путь к этому каталогу, включая название файла:

-out /путь/к/файлу.pem

Генерация ключевой пары ГОСТ в файл

Пример:

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out privatekey.pem 

Значения параметров:

ПараметрВозможные значения
algorithm
  • gost2001;
  • gost2012_256;
  • gost2012_512
-pkeyopt

paramset:<value> 

Поддерживаемые значения value в зависимости от алгоритма:

  • gost2001
    • A;
    • B;
    • C;
    • XA;
    • XB.
  • gost2012_256:
    • A;
    • B;
    • C;
    • id-GostR3410-2001-CryptoPro-A-ParamSet;
    • id-GostR3410-2001-CryptoPro-B-ParamSet;
    • id-GostR3410-2001-CryptoPro-C-ParamSet.
  • gost2012_512:
    • A;
    • B;
    • C.

Параметры кривых, соответствующие значениям, описаны в Приложении 1.

Генерация ключевой пары ECDSA в файл

Пример: 

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:secp256r1 -out privatekey.pem 

Значения параметров:

ПараметрВозможные значения
algorithm 

EC

-pkeyopt
  • ec_param_enc:<encoding> — определение параметров кривой. Может принимать значение named_curve (используется существующая кривая) или explicit (параметры кривой задаются вручную; не рекомендуется с точки зрения безопасности и совместимости).
    Значение encoding по умолчанию: named_curve.
  • ec_param_curve:<curve> — название эллиптической кривой.
    Чтобы посмотреть список эллиптических кривых, поддерживаемых установленной версией OpenSSL, выполните команду:
    openssl ecparam -list_curves

Генерация ключевой пары RSA в файл

Пример:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsakey.pem

Значения параметров:

ПараметрВозможные значения
algorithm 

RSA

-pkeyopt 
  • rsa_keygen_bits:<numbits> — длина ключа в битах.
    Значение numbits по умолчанию: 2048
  • rsa_keygen_primes:<numprimes> — количество простых чисел в генерируемом ключе.
    Значение numprimes по умолчанию: 2

  • rsa_keygen_pubexp:<value> — значение открытой экспоненты. Может быть представлено в десятичной или шестнадцатеричном системе (для этого перед значением нужно поставить 0x).
    Значение value по умолчанию: 65537

Генерация ключевой пары на Рутокене

Через OpenSSL генерация ключевых пар на Рутокене пока не поддерживается. Используйте для этого pkcs11-tool из состава OpenSC.

Генерация ключевой пары ГОСТ

Формат команды:

pkcs11-tool --module mod --login --pin pin --keypairgen --key-type specification --id id --usage-derive

Описание параметров:

ПараметрОписание
--moduleМодуль или библиотека PKCS #11, которая будет использована для генерации ключевой пары
--login, -lПараметр используется, чтобы потребовать аутентификацию на токене перед выполнением операции.
Параметр --login не обязателен, если используется параметр --pin
--pin, --pPIN-код, который будет использован для подтверждения генерации ключевой пары.
Использование параметра --pin автоматически включает параметр --login
--keypairgen, -kТип операции (генерация новой ключевой пары)
--key-type

Тип и параметры алгоритма шифрования (размер ключа, параметры эллиптической кривой, и т.д.).

--id, -d

Идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII.

Tip

Чтобы использовать этот ID через OpenSSL, нужно использовать символы, соответствующие этим кодам.
Например, для ключевой пары ГОСТ с ID "--id 3132" в PKCS #11 URI нужно указать "pkcs11:id=12". 
Конвертировать ID в формат, подходящий для работы с OpenSSL, можно с помощью онлайн-сервиса конвертации HEX в ASCII.

--usage-derive

Параметр указывает на то, что на сгенерированном ключе можно вырабатывать общий симметричный ключ, который может использоваться, например, для расшифрования CMS-сообщений.

Если шифрование сообщений на генерируемой ключевой паре не планируется, этот параметр можно не использовать. 

ГОСТ-2001

Пример:

pkcs11-tool --module /путь/к/библиотеке/rtPKCS11ECP --login --pin 12345678 --keypairgen --key-type GOSTR3410:A --id 3132 --usage-derive

Значения параметров:

ПараметрВозможные значения
--module

Для Windows:

/путь/к/файлу/rtPKCS11ECP.dll

Для Linux:

/путь/к/файлу/librtpkcs11ecp.so

--key-type
  • GOSTR3410-2001:A;
  • GOSTR3410-2001:B;
  • GOSTR3410-2001:C.

Более подробно значения описаны в Приложении 1.

ГОСТ-2012

Tip

Собирайте ветку pkcs11-tool с поддержкой ГОСТ-2012 или используйте релиз OpenSC 0.20.0 или новее.

Пример:

pkcs11-tool --module /путь/к/библиотеке/rtPKCS11ECP --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132 --usage-derive 

...

Генерация ключевой пары RSA в файл

Пример:

...

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsakey.pem

Значения параметров:

...

RSA

...

  • rsa_keygen_bits:<numbits> — .
    Значение numbits по умолчанию: 2048
  • rsa_keygen_primes:<numprimes> — .
    Значение numprimes по умолчанию: 2

  • rsa_keygen_pubexp:<value> — .
    Значение value по умолчанию: 65537

Генерация ключевой пары на Рутокене

Генерация ключевой пары ГОСТ

Через OpenSSL генерация ключевой пары ГОСТ на Рутокене пока не поддерживается. Используйте для этого pkcs11-tool из состава OpenSC.

Формат команды:

pkcs11-tool --module mod --login --pin pin --keypairgen --key-type specification --id id --usage-derive

Описание параметров:

...

Откуда берётся ID? Или он задаётся пользователем самостоятельно? Зачем нужна часть про «использовать этот id через OpenSSL», если тут мы используем pkcs11-tool?

Идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII.
Чтобы использовать этот id через OpenSSL надо использовать символы, соответствующие этим кодам. Например: для ‘--id 3132’ в OpenSSL надо указывать "pkcs11:id=12".  
Есть удобный онлайн-сервис конвертации строки в ASCII-коды

...

Параметр указывает на то, что на сгенерированном ключе можно вырабатывать общий симметричный ключ, который может использоваться, например, для расшифрования CMS-сообщений.

Если шифрование сообщений на генерируемой ключевой паре не планируется, этот параметр можно не использовать. 

ГОСТ-2001

Пример:

...

pkcs11-tool --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410:A --id 3132 --usage-derive

Значения параметров:

...

  • GOSTR3410:A;
  • GOSTR3410:B;
  • GOSTR3410:C

...

ГОСТ-2012

Tip

Собирайте ветку pkcs11-tool с поддержкой ГОСТ-2012, или используйте релиз OpenSC 0.20.0 или новее.

Пример:

...

pkcs11-tool --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132 --usage-derive 

Значения параметров:

...

Для алгоритма GOSTR3410-2012-256:

  • GOSTR3410-2012-256:B;
  • GOSTR3410-2012-256:C;
  • GOSTR3410-2012-256:D.

Для алгоритма GOSTR3410-2012-512:

  • GOSTR3410-2012-512:A;
  • GOSTR3410-2012-512:B;
  • GOSTR3410-2012-512:C.

...

Для удобства, можно воспользоваться онлайн-сервисом конвертации ACSII-кодов в строку.

Почему выше (и ниже) конвертация строки в коды, а тут кодов в строку? 

или

используйте веб-сервис "Центр регистрации Рутокен"

Для чего?

Генерация ключевой пары ECDSA

Пример:

...

Значения параметров:

ПараметрВозможные значения
--module

Для Windows:

/путь/к/файлу/rtPKCS11ECP.dll

Для Linux:

/путь/к/файлу/librtpkcs11ecp.so

--key-type

Для

Рутокен ЭЦП 3.0 3110 и 3220:
  • EC:secp256r1;
  • EC:secp256k1.

Для Рутокен ЭЦП 3.0 3120:

  • EC:secp256r1;
  • EC:secp256k1;
  • EC:secp384r1;
  • EC:secp521r1.
--idНужна конвертация в ASCII?

Генерация ключевой пары RSA

Пример:

...

алгоритма GOSTR3410-2012-256:

  • GOSTR3410-2012-256:B;
  • GOSTR3410-2012-256:C;
  • GOSTR3410-2012-256:D.

Для алгоритма GOSTR3410-2012-512:

  • GOSTR3410-2012-512:A;
  • GOSTR3410-2012-512:B;
  • GOSTR3410-2012-512:C.

Более подробно значения описаны в Приложении 1.

Генерация ключевой пары ECDSA

Пример:

pkcs11-tool --module /путь/к/библиотеке/rtPKCS11ECP --login --pin 12345678 --keypairgen --key-type EC:secp256r1 --id 3132 --usage-derive

...

Значения параметров:

ПараметрВозможные значения
--module

Для Windows:

/путь/к/файлу/rtpkcs11ecp.dll

Для Linux:

/путь/к/файлу/librtpkcs11ecp.so
--key-type

Для Рутокен ЭЦП

2

3.0

:
  • RSA:1024 (небезопасно);
  • RSA:2048

    3110 и 3220:

    • EC:secp256r1;
    • EC:secp256k1.

    Для Рутокен ЭЦП 3.0 3120:

    RSA:1024 (небезопасно)
    • EC:secp256r1;
    • EC:secp256k1;
    RSA
    • EC:
    2048
    • secp384r1;
    RSA
    • EC:
    4096
    • secp521r1.
    --idНужна конвертация в ASCII?

    Просмотр объектов на токене

    Генерация ключевой пары RSA

    ПримерПосмотреть записанные на токен объекты можно с помощью команды:

    pkcs11-tool --module rtPKCS11ECP.dll -Ol

    Формирование запроса PKCS#10 

    Сформировать запрос можно:

    ...

    openssl req -utf8 -new -key privatekey.pem -out req.csr

    ...

    openssl req -utf8 -new -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out req.csr
    Tip

    Формат параметра -key описан в разделе "Использование ключей на Рутокене"

    /путь/к/библиотеке/rtPKCS11ECP --login --pin 12345678 --keypairgen --key-type RSA:2048 --id 3132

    Значения параметров:

    ПараметрВозможные значения
    --module

    Для Windows:

    /путь/к/файлу/rtpkcs11ecp.dll

    Для Linux:

    /путь/к/librtpkcs11ecp.so

    --key-type
    Warning

    Использовать 1024-битные ключи RSA небезоспано.
    Рекомендуем использовать как минимум 2048-битные ключи.

    Для Рутокен ЭЦП 2.0:

    • RSA:1024;
    • RSA:2048.

    Для Рутокен ЭЦП 3.0:

    • RSA:1024;
    • RSA:2048;
    • RSA:4096.

    Просмотр объектов на токене

    Посмотреть записанные на токен объекты можно с помощью команды:

    pkcs11-tool --module /путь/к/библиотеке/rtPKCS11ECP -Ol

    Формирование запроса PKCS#10 

    Сформировать запрос можно

    В процессе работы команда попросит ввести PIN-код. После этого потребуется указать данные для сертификата. 

    Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cnf. По умолчанию нужно указать следующую информацию:

    • State or Province []: Moscow

    • Locality []:  RU

    • Organization Name []: Aktiv Company

    • Organizational Unit Name []: development

    • Common Name []: tester

    • Email []: tester@rutoken.ru

    Есть ли у этих полей обязательные значения (= можно ли вместо Moscow/RU/Aktiv Company указать условно Aaaaa/AU/Some Company)? Или стоит здесь рассказать про CA и флаг match в конфиге?

    https://docs.openssl.org/1.0.2/man1/ca/#policy-format

    Выпуск самоподписанного сертификата по запросу

    Самоподписанный сертификат можно выпустить:

    • с помощью ключа в файле:

      openssl

    • req

    • -utf8

    • -

    • x509
    • new -key

    • /путь/к/файлу/
    • privatekey.pem

    • -out

    • cert
    • req.

    • cer
    • csr

    • с помощью ключа на Рутокене:

      openssl

    • req

    • -utf8

    • -

    • x509
    • new -keyform

    • engine

    • -key

    • "pkcs11:your_pkcs11_uri"

    • -engine

    • rtengine

    • -out

    • cert.cer -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=devNN/CN=testuser/emailAddress=testuser@mail.com"

    Параметры сертификата:

    • req.csr

    В процессе работы команда попросит ввести PIN-код. После этого потребуется указать данные для сертификата. 

    Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cnf. По умолчанию нужно заполнить следующие поля:

    Anchor
    cert
    cert

    Параметр
    Поле
    Описание

    C

     

    CountryName

    Страна

    ST

    StateOrProvinceName

    Регион или область

    L

    Locality

    Населенный пункт (город, село, поселок и т.д.)

    O

    Organization

    Название организации

    OU

    OrganizationalUnit

    Название отдела в организации

    CN

    CommonName

    Имя владельца сертификата

    emailAddressПочтовый адрес владельца сертификата

    Выпуск самоподписанного сертификата

    ...

    Работе с подписью в формате CMS

    Создание подписи

    Для создания CMS подписи необходимо иметь сертификат. В тестовых целях в папке sdk\openssl\samples\tool\ предоставлены настройки удостоверяющего центра OpenSSL, который позволяет выпускать сертификаты. 

    Для того, чтобы создать CMS-подпись с помощью предоставленного УЦ:

    ...

     Используя -nodetach подписываемые данные включаются в состав CMS пакета — присоединенная подпись. Без этой опции подпись будет «отсоединенной».

     Используя -nocerts сертификат подписанта не включается в состав CMS пакета.

    Проверка подписи

     openssl cms -verify -binary -in signed_cms -inform PEM -out verified_data -CAfile demoCA/cacert.pem -content data_to_sign

    Файл, указанный в -CAfile, является доверенным сертификатом удостоверяющего центра и используется для проверки сертификата подписанта.

    В опцию -content передается файл с подписанными данными, если он не был включен в состав CMS пакета.

    Если сертификат подписанта не был включен в CMS пакет (отсоединенная подпись), он указывается в опции -certfile.

    Шифрование в формате CMS

    Зашифрование

    ...

    titleШифрование на ключах с Рутокена

    При расшифровании сообщения вырабатывается общий симметричный ключ, который непосредственно и используется при расшифровке. Рутокен позволяет генерировать такой общий ключ только на не извлекаемых закрытых ключах с опцией 'derive' в поле key usage. Для того чтобы указать эту опцию, при генерации ключа используйте флаг  --usage-derive. Например:

    pkcs11-tool.exe --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132 --usage-derive

     

      openssl cms -encrypt -binary -<alg> -in test_data -out encrypted_cms -outform PEM respondent.cer

    respondent.cer: сертификат адресата, для которого шифруется сообщение.
    Где alg может принимать значения:

    Для ГОСТ:

    gost28147-paramset_a-cfb (для rtengine 0.7): алгоритм, работает в режиме гаммирования с обратной связью с набором параметров А.

    ...

    Расшифрование на стороне адресата

    Расшифровать данные можно:

    ...

    openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -inkey privatekey.pem -out decrypted_cms_data

    ...

    «Сырая» подпись данных

    Подписать данные «сырой» подписью можно:

    ...

    openssl dgst -sign privatekey.pem -out file_to_sign.signature file_to_sign.txt

    ...

    openssl dgst -keyform engine -sign "pkcs11:your_pkcs11_uri" -engine rtengine -out file_to_sign.signature file_to_sign.txt

    ...

    Проверка «сырой подписи»

    ...

    openssl pkey -in privatekey.pem -pubout -out publickey.pem

    ...

    openssl dgst -verify publickey.pem -signature signed_file.signature signed_file.txt

    ...

    openssl dgst -keyform engine -verify "pkcs11:your_pkcs11_uri" -engine rtengine -signature signed_file.signature signed_file.txt

    Запуск SSL/TLS сервера

    Формат команды:

    ...

    Описание параметров:

    ...

    Название файла или URI закрытого ключа.

    Если параметр не задан, будет использован файл сертификата

    ...

    Формат файла закрытого ключа.

    Значение по умолчанию: PEM

    ...

    Модуль для работы с криптографическими алгоритмами. 

    Задается, если задан параметр -keyform engine

    ...

    TCP-порт, который будет прослушиваться в ожидании запросов.

    Значение по умолчанию: 4433

    ...

    Назначение сертификата.

    Возможные значения:

    • slclient;
    • sslserver;
    • nssslserver;
    • mimesign;
    • mimeencrypt;
    • crlsign;
    • ocsphelper;
    • timestampsign;
    • codesign;
    • any.

    ...

    Примеры команд:

    Code Block
    languagepowershell
    titleКлюч в файле
    openssl s_server -key demoCA/private/cakey.pem -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4
    Code Block
    languagepowershell
    titleКлюч на токене
    openssl s_server -key "pkcs11:server_key_pkcs11_uri" -keyform engine -engine rtengine -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4

    Запуск SSL/TLS клиента

    Формат команды:

    ...

    Описание параметров:

    ...

    Название файла или URI закрытого ключа.

    Если параметр не задан, будет использован файл сертификата

    ...

    Формат файла закрытого ключа.

    Значение по умолчанию: PEM

    ...

    Модуль для работы с криптографическими алгоритмами. 

    Задается, если задан параметр -keyform engine

    ...

    Примеры команд:

    Code Block
    languagepowershell
    titleКлиент, ключ в файле
    openssl s_client -key privatekey.pem -cert cert.cer -host 127.0.0.1 -port 44330

    ...

    languagepowershell
    titleКлиент, ключ на токене

    ...

    по запросу 

    Самоподписанный сертификат можно выпустить:

    • с помощью ключа в файле:

      openssl req -utf8 -x509 -key /путь/к/файлу/privatekey.pem -out cert.cer 

    • с помощью ключа на Рутокене:

      openssl req -utf8 -x509 -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out cert.cer -subj "/C=<страна>/ST=<регион>/L=<населенный_пункт>/O=<организация>/OU=<отдел>/CN=<ФИО>/emailAddress=<email>" 

    Подробнее параметры сертификата описаны в предыдущем разделе.

    Работа с подписью в формате CMS

    Создание подписи

    Tip

    По умолчанию команда openssl cms -sign создает открепленную подпись (подпись, которая сохраняется в отдельный файл), а сертификат подписанта включается в состав CMS-пакета. Изменить это поведение можно с помощью двух опциональных параметров:

    • -nodetach включает подписываемые данные в состав CMS-пакета и создает присоединенную подпись:
    • -nocerts исключает сертификат подписанта из состава CMS-пакета.

    Для создания CMS-подписи необходимо иметь сертификат. В тестовых целях в Рутокен SDK предоставлены настройки удостоверяющего центра OpenSSL, который позволяет выпускать сертификаты. 

    Для того, чтобы создать CMS-подпись с помощью предоставленного УЦ:

    1. Скачайте Рутокен SDK и распакуйте архив.
    2. Из распакованного архива скопируйте папку /sdk/openssl/samples/tool/demoCA и конфигурационный файл openssl.cnf в папку с OpenSSL.
    3. Выполните команду:
      openssl ca -batch -in req.csr -out cert.cer
    4. Создайте CMS-подпись:
      • с помощью ключа в файле:
        openssl cms -sign -binary -nosmimecap -in data_to_sign -out signed_cms -outform PEM -inkey privatekey.pem -signer cert.cer
      • с помощью ключа на Рутокене:
        openssl cms -sign -binary -nosmimecap -in data_to_sign -out signed_cms -outform PEM -keyform engine -inkey "pkcs11:your_pkcs11_uri" -engine rtengine -signer cert.cer

    Проверка подписи

    Чтобы проверить подпись, выполните команду:

    openssl cms -verify -binary -in signed_cms -inform PEM -out verified_data -CAfile demoCA/cacert.pem -content data_to_sign

    Файл, указанный в -CAfile, является доверенным сертификатом удостоверяющего центра и используется для проверки сертификата подписанта.

    В опцию -content передается файл с подписанными данными, если он не был включен в состав CMS пакета.

    Если сертификат подписанта не был включен в CMS пакет (отсоединенная подпись), он указывается в опции -certfile.

    Шифрование в формате CMS

    Зашифрование

    Info
    titleШифрование на ключах с Рутокена

    При расшифровании сообщения вырабатывается общий симметричный ключ. Этот же ключ используется при расшифровке. Рутокен позволяет генерировать такой общий ключ только на неизвлекаемых закрытых ключах с опцией derive в поле key usage. Для того, чтобы указать эту опцию, при генерации ключа используйте флаг  --usage-derive. Например:

    pkcs11-tool.exe --module /путь/к/библиотеке/rtPKCS11ECP --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132 --usage-derive

    Формат команды:

    openssl cms -encrypt -binary -<cipher> -in data_to_encrypt -out encrypted_cms -outform DER|PEM|SMIME respondent.cer

    Описание параметров:

    ПараметрОписание
    -encryptТип операции (зашифрование)
    -binary

    По умолчанию, входное сообщение конвертируется в канонический формат, который использует CR и LF в качестве знака перевода строки (в соответствии со по спецификацией S/MIME). Параметр -binary отключает эту конвертацию. 

    -<cipher>

    Алгоритм шифрования. Возможные значения зависят от типа ключа.

    Для ключей ГОСТ и rtengine версии 0.7:

    • gost28147-paramset_a-cfb - алгоритм, который работает в режиме гаммирования с обратной связью с набором параметров А.

    Для ключей ГОСТ и rtengine версии 0.7 и выше:

    • gost28147-cfb — алгоритм, который работает в режиме гаммирования с обратной связью с набором параметров Z.

    Для RSA и ECDSA ключей:

    • aes128 — AES-128;
    • aes192 — AES-192;
    • aes256 — AES-256;
    • des — DES;
    • des3 — Triple DES (3DES)
    -inВходное сообщение, которое нужно зашифровать
    -outНазвание файла, в который будет сохранено зашифрованное сообщение
    -outform

    Формат CMS-структуры.

    Значение по умолчанию: SMIME

    respondent.cerCертификат адресата, для которого шифруется сообщение

    Расшифрование на стороне адресата

    Расшифровать данные можно:

    • с помощью ключа в файле:

      openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -inkey privatekey.pem -out decrypted_cms_data

    • с помощью ключа на Рутокене:
      openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -keyform engine -inkey "pkcs11:your_pkcs11_uri" -engine rtengine -out decrypted_cms_data

    Работа с «сырыми» подписями

    Подпись данных 

    Подписать данные «сырой» подписью можно:

    • с помощью ключа в файле:

      openssl dgst -sign privatekey.pem -out file_to_sign.sig file_to_sign.txt

    • с помощью ключа на Рутокене:

      openssl dgst -keyform engine -sign "pkcs11:your_pkcs11_uri" -engine rtengine -out file_to_sign.sig file_to_sign.txt

      Алгоритм хеша будет зависеть от алгоритма ключа.

    Проверка «сырой» подписи

    1. Получите открытый ключ из закрытого:

      openssl pkey -in privatekey.pem -pubout -out publickey.pem

    2. Проверьте подпись:
      • с помощью ключа в файле:

        openssl dgst -verify publickey.pem -signature signed_file.sig signed_file.txt

      • с помощью ключа на Рутокене:

        openssl dgst -keyform engine -verify "pkcs11:your_pkcs11_uri" -engine rtengine -signature signed_file.sig signed_file.txt

    Запуск SSL/TLS сервера

    Формат команды:

    openssl s_server -key filename|uri [-keyform format] [-engine id] -cert infile -Verify int -CAfile file -accept val -WWW -purpose purpose -4 

    Описание параметров:

    ПараметрОписание
    -key

    Название файла или URI закрытого ключа.

    Если параметр не задан, будет использован файл сертификата

    -keyform

    Формат файла закрытого ключа.

    Значение по умолчанию: PEM

    -engine

    Модуль для работы с криптографическими алгоритмами. 

    Задается, если задан параметр -keyform engine

    -certПуть к сертификату
    -VerifyГлубина проверки цепочки сертификатов
    -CAfileПуть к доверенному сертификату
    -accept

    TCP-порт, который будет прослушиваться в ожидании запросов.

    Значение по умолчанию: 4433

    -WWWЭмуляция простого веб-сервера
    -purpose

    Назначение сертификата.

    Возможные значения:

    • slclient;
    • sslserver;
    • nssslserver;
    • mimesign;
    • mimeencrypt;
    • crlsign;
    • ocsphelper;
    • timestampsign;
    • codesign;
    • any.
    -4Использовать только IPv4

    Примеры команд:

    Ключ в файле

    openssl s_server -key demoCA/private/cakey.pem -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4

    Ключ на токене

    openssl s_server -key "pkcs11:server_key_pkcs11_uri" -keyform engine -engine rtengine -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4

    Запуск SSL/TLS клиента

    Формат команды:

    openssl s_client -key filename|uri [-keyform format] [-engine id] -cert filename-host hostname -port port

    Описание параметров:

    ПараметрОписание
    -key

    Название файла или URI закрытого ключа.

    Если параметр не задан, будет использован файл сертификата

    -keyform

    Формат файла закрытого ключа.

    Значение по умолчанию: PEM

    -engine

    Модуль для работы с криптографическими алгоритмами. 

    Задается, если задан параметр -keyform engine

    -certПуть к сертификату
    -hostАдрес сервера, с которым нужно установить соединение
    -portПорт сервера, с которым нужно установить соединение

    Примеры команд:

    Ключ в файле

    openssl s_client -key privatekey.pem -cert cert.cer -host 127.0.0.1 -port 44330

    Ключ на токене

    openssl s_client -key "pkcs11:client_key_pkcs11_uri" -keyform engine -engine rtengine -cert cert.cer -host 127.0.0.1 -port 44330

    Приложение 1. Парамсеты ГОСТ в OpenSSL и pkcs11-tool 
    Anchor
    gost
    gost

    Таблица значений -pkeyopt для OpenSSL

    ГОСТ 34.10-2001

    АлгоритмOID парамсетаДопустимое значение аргумента

    gost2001

    1.2.643.2.2.35.1
    • A;
    • id-GostR3410-2001-CryptoPro-A-ParamSet
    1.2.643.2.2.35.2
    • B;
    • id-GostR3410-2001-CryptoPro-B-ParamSet
    1.2.643.2.2.35.3
    • C;
    • id-GostR3410-2001-CryptoPro-C-ParamSet
    1.2.643.2.2.36.0
    • XA;
    • id-GostR3410-2001-CryptoPro-XchA-ParamSet
    1.2.643.2.2.36.1
    • XB;
    • id-GostR3410-2001-CryptoPro-XchB-ParamSet
    ГОСТ 34.10-2012-256
    АлгоритмOID парамсетаДопустимое значение аргумента

    gost2012_256 

    1.2.643.7.1.2.1.1.1

    • A;
    • id-tc26-gost-3410-2012-256-paramSetA

    1.2.643.7.1.2.1.1.2

    • B;
    • id-tc26-gost-3410-2012-256-paramSetB

    1.2.643.7.1.2.1.1.3

    • C;
    • id-tc26-gost-3410-2012-256-paramSetC

    1.2.643.7.1.2.1.1.4

    • D;
    • id-tc26-gost-3410-2012-256-paramSetD
    1.2.643.2.2.35.1id-GostR3410-2001-CryptoPro-A-ParamSet
    1.2.643.2.2.35.2id-GostR3410-2001-CryptoPro-B-ParamSet
    1.2.643.2.2.35.3id-GostR3410-2001-CryptoPro-C-ParamSet
    1.2.643.2.2.36.0id-GostR3410-2001-CryptoPro-XchA-ParamSet
    1.2.643.2.2.36.1id-GostR3410-2001-CryptoPro-XchB-ParamSet

    ГОСТ 34.10-2012-512

    АлгоритмOID парамсетаДопустимое значение аргумента

    gost2012_512

    1.2.643.7.1.2.1.2.1
    • A;
    • id-tc26-gost-3410-2012-512-paramSetA
    1.2.643.7.1.2.1.2.2
    • B;
    • id-tc26-gost-3410-2012-512-paramSetB
    1.2.643.7.1.2.1.2.3
    • C;
    • id-tc26-gost-3410-2012-512-paramSetC

    Таблица значений --key-type для pkcs11-tool

    ГОСТ 34.10-2001
    АлгоритмOID парамсетаДопустимое
    значение аргумента
    Название парамсета
    GOSTR3410-20011.2.643.2.2.35.1A

    id-GostR3410-2001-CryptoPro-A-ParamSet

    1.2.643.2.2.35.2Bid-GostR3410-2001-CryptoPro-B-ParamSet
    1.2.643.2.2.35.3Cid-GostR3410-2001-CryptoPro-C-ParamSet

    ГОСТ 34.10-2012-256

    АлгоритмOID парамсетаДопустимое
    значение аргумента
    Название парамсета

    GOSTR3410-2012-256

    1.2.643.7.1.2.1.1.1

    A

     id-tc26-gost-3410-12-256-paramSetA

    Note

    Парамсет не поддерживается на устройствах ЭЦП 2.0 с версией микропрограммы 24 или ниже.

    Определить версию МП  можно с помощью Утилиты диагностики Рутокен.

    1.2.643.7.1.2.1.1.2

    B id-tc26-gost-3410-12-256-paramSetB

    1.2.643.7.1.2.1.1.3

    C id-tc26-gost-3410-12-256-paramSetC

    1.2.643.7.1.2.1.1.4

    D id-tc26-gost-3410-12-256-paramSetD

    ГОСТ 34.10-2012-512

    АлгоритмOID парамсетаДопустимое
    значение аргумента
    Название парамсета

    GOSTR3410-2012-512


     

    1.2.643.7.1.2.1.2.1A

    id-tc26-gost-3410-12-512-paramSetA

    1.2.643.7.1.2.1.2.2Bid-tc26-gost-3410-12-512-paramSetB
    1.2.643.7.1.2.1.2.3C

    id-tc26-gost-3410-12-512-paramSetC

    Note

    Парамсет не поддерживается на устройствах ЭЦП 2.0 с версией микропрограммы 24 или ниже.

    Определить версию МП  можно с помощью Утилиты диагностики Рутокен.