Page tree

Versions Compared

Key

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

Table of Contents

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

В данной статье описаны следующие сценарии использования Рутокена с 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 

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

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

Для Windows:

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

Для Linux:

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

--key-type

Для алгоритма 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

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

  • EC:secp256r1;
  • EC:secp256k1.

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

  • EC:secp256r1;
  • EC:secp256k1;
  • EC:secp384r1;
  • EC:secp521r1.

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

Пример:

pkcs11-tool --module /путь/к/библиотеке/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 

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

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

    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

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

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

Anchor
cert
cert

ПолеОписание

C

 

CountryName

Страна

ST

StateOrProvinceName

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

L

Locality

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

O

Organization

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

OU

OrganizationalUnit

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

CN

CommonName

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

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

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

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

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

    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 или ниже.

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

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

rtengine позволяет использовать ключи, расположенные на токене.

Ключевая пара идентифицируется с помощью pkcs11 uri.

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

   manufacturer: ID производителя токена

   model: модель токена

   serial: серийный номер токена

   token: метка токена(поле "label")

   object: имя объекта(CKA_LABEL)

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

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

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

Если подключен только один Рутокен с единственной ключевой парой:

...

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

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

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

Укажите алгоритм, используя опцию -algorithm.

Укажите параметры эллиптической кривой (парамсет) с помощью -pkeyopt.

Поддерживаются следующие значения алгоритмов и соответствующих им парамсетов:

   gost2001: A,B,C,XA,XB

   gost2012_256: A,B,C,XA,XB

   gost2012_512: A,B

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

openssl genpkey -algorithm EC -out seckey.pem -pkeyopt ec_paramgen_curve:prime256v1   

Укажите алгоритм, используя опцию -algorithm.

Укажите параметры эллиптической кривой (парамсет) с помощью -pkeyopt.

Чтобы посмотреть список доступных эллиптических кривых, поддерживаемых вашей версией OpenSSL
openssl ecparam -list_curves

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

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

Укажите алгоритм, используя опцию -algorithm.

Укажите параметры эллиптической кривой (парамсет) с помощью -pkeyopt.

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

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

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

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

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

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

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

...

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

Info

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

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

pin: PIN-код Рутокена

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

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

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

GOSTR3410-2012-512:A : ‘A’ - парамсет, может быть так же B или С,

GOSTR3410-2012-256:B : ‘B’ - парамсет, может быть так же C или D

или

...

Для просмотра объектов на токене:

    pkcs11-tool.exe --module rtPKCS11ECP.dll -Ol

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

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

    pkcs11-tool --module /path/to/librtpkcs11ecp.so --keypairgen --key-type EC:prime256v1 -l --id 3132 --usage-derive

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

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

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

    pkcs11-tool --module /path/to/librtpkcs11ecp.so --keypairgen --key-type RSA:2048 -l --id 3132

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

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

...

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

...

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

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

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

  • State or Province []: Moscow

  • Locality []:  RU

  • Organization Name []: Aktiv Company

  • Organizational Unit Name []: development

  • Common Name []: tester

  • Email []: tester@rutoken.ru

Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cnf.

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

...

openssl req -utf8 -x509 -key seckey.pem -out cert.cer

...

openssl req -utf8 -x509 -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"

Создание подписи в формате CMS

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

Скопируйте папку sdk\openssl\samples\tool\demoCA и конфигурационный файл openssl.cnf в папку с OpenSSL и выполните:

openssl ca -batch -in req.csr -out cert.cer

...

openssl cms -sign -binary -nosmimecap -in data_to_sign -out signed_cms -outform PEM -inkey seckey.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

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

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

Проверка подписи в формате 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.

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

 Используя ключ в файле:

openssl dgst -sign seckey.pem -out signature data_to_sign

 Используя ключ на Рутокене:

openssl dgst -keyform engine -sign "pkcs11:your_pkcs11_uri" -engine rtengine -out signature data_to_sign

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

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

 Получить открытый ключ из закрытого можно следующей командой:

   openssl pkey -in seckey.pem -pubout -out pubkey.pem

...

   openssl dgst -verify pubkey.pem -signature signature data_to_sign

 Используя ключ на Рутокене:

   openssl dgst -keyform engine -verify "pkcs11:your_pkcs11_uri" -engine rtengine -signature signature test_data

Шифрование в формате 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 -<gost28147-xxx-alg> -in test_data -out encrypted_cms -outform PEM respondent.cer

respondent.cer: сертификат адресата, для которого шифруется сообщение.
Где gost28147-xxx-alg:

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

...

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

Используя ключ в файле:

   openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -inkey seckey.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

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

Сервер, ключ в файле:

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 -keyform engine -key "pkcs11:server_key_pkcs11_uri" -engine rtengine -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4

Клиент, ключ в файле:

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

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

...