Page tree

Versions Compared

Key

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


Status
subtletrue
colourRed
titleВ работе

Table of Contents

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

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

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

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

КомпонентОписание
manufacturerID производителя токена

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

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

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

pkcs11:model=Rutoken%20ECP

...

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



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

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

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

ПараметрОписание
-algorithmАлгоритм шифрования
-pkeyoptПараметры алгоритма (размер ключа, тип эллиптической кривой, и т.д.)
-out

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

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

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

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

Пример:

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out

...

privatekey.pem

...

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

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

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

...

 

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

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

paramset:<value> 

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

  • 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

...

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

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

...

-out privatekey.pem 

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

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

EC

-pkeyopt 
  • ec_param_enc:<encoding> — .
    Значение 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> — .
    Значение value по умолчанию: 65537

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

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

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

...

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

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

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

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

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

...

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

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

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

Идентификатор

...

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

--usage-derive

...

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

...

CMS-сообщений.

Если

...

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

...

этот

...

параметр можно

...

не использовать. 

ГОСТ-2001

Пример:

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

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

ПараметрВозможные значения
--key-type
  • GOSTR3410:A;
  • GOSTR3410:B;
  • GOSTR3410:C
--idНужна ли конвертация в ASCII?

ГОСТ-2012

Tip

...

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

Info

Собирайте ветку pkcs11-tool с поддержкой ГОСТ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 

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

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

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

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

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

ПараметрВозможные значения
--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.
--id

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

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



или

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

Для

...

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

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

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

...

чего?

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

Пример:

Code Block
pkcs11-tool --module /путь/к/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type EC:secp256r1

...

 --id 3132 --usage-derive

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

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

Для Windows:


Для Linux:


--key-type

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

...

:

  • EC:secp256r1;
  • EC:secp256k1.

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

...

:

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

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

Пример:

Code Block
pkcs11-tool --module /путь/к/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type RSA:2048 --id 3132 

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

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

Для Windows:


Для Linux:


--key-type

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

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

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

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

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

...

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

...

:

  • RSA:1024 (

...

  • небезопасно)

...

  • ;
  • RSA:2048

...

  • ;
  • RSA:4096.

...

--idНужна конвертация в ASCII?

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

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

pkcs11-tool --module rtPKCS11ECP.dll -Ol

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

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

  • с помощью ключа

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

...

  • в файле:
    openssl req -utf8 -new -key

...

  •  privatekey.pem -out req.csr

...




В процессе работы команда попросит ввести 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 -key

...

  •  /путь/к/файлу/privatekey.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"

...

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

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

C

 

CountryName

Страна

ST

StateOrProvinceName

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

L

Locality

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

O

Organization

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

OU

OrganizationalUnit

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

CN

CommonName

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

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

Работе с подписью

...

в формате CMS

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

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

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

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

...

  1. .
  2. Выполните команду:
    openssl ca -batch -in req.csr -out cert.cer

...

  1. Создайте CMS подпись

...

  1. : 
    • с помощью ключа в файле:
      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 пакета.

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

...

 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 -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

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

Info
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> <alg> -in test_data -out encrypted_cms -outform PEM respondent.cer

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

Для ГОСТ:

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

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

Для RSA и ECDSA ключей:
-aes128 — AES-128.
-aes192 — AES-192.
-aes256 — AES-256.
-des — DES.
-des3 — Triple DES (3DES).

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

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

...

Используя ключ

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

...

  • 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.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

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

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

...


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

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

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

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

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

      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 сервера

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

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

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

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 клиента

Формат командыКлиент, ключ в файле:

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Порт сервера, с которым нужно установить соединение

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

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

...

127.0.0.1 -port 44330

...

Code Block
languagepowershell
titleКлиент, ключ на токене
openssl s_client -key "pkcs11:client_key_pkcs11_uri" -keyform engine -engine rtengine -cert cert.cer -host 127.0.0.1 -port 44330