Page tree

Versions Compared

Key

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

Table of Contents


Предварительная подготовка

Info
Подключите устройств семейства Рутокен ЭЦП к компьютеру.

 

Перед началом работы, установите следующие пакеты:

# для ubuntu
sudo apt-get update
sudo apt-get install pcscd opensc openssl libengine-pkcs11-openssl

# для red os
sudo yum update
sudo yuminstall ccid opensc

pam_pkcs11 gdm-plugin-smartcard

p11-kit
 
# для alteros
sudo yum update
sudo yuminstall ccid opensc

pam_pkcs11 gdm-plugin-smartcard

p11-kit openssl-pkcs11
 
# для astra и alt linux
sudo apt-get update
sudo apt-getinstall ccid opensc

pam_pkcs11 gdm-plugin-smartcard

p11-kit
 
# для rosa
sudo dnf --auto-update
sudo dnf install ccid opensc

pam_pkcs11 gdm-plugin-smartcard

p11-kit


Загрузите модуль librtpkcs11ecp.so и установите:

...

Для этого соберите библиотеку libp11 из репозитория. Вместе с ней идет libpkcs11.so начиная с версии 0.4.


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

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

Ключевая пара идентифицируется с помощью 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

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

pkcs11:model=Rutoken%20ECP

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


Создание ключей

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

pkcs11-tool --module /usr/lib64lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048   -l --id 3132

id

...

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

Проверим сгенерированный ключ:

pkcs11-tool --module   /usr/lib/librtpkcs11ecp.so -O

Создание сертификата и импорт его на токен через OpenSSL 1.1.x


Теперь нужно получить сертификат (путь до библиотеки pkcs11 может отличаться в зависимости от ОС):

  • создайте самоподписанный сертификат:

openssl
 
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib64/engines-1.1/libpkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib64/librtpkcs11ecp.so
 
OpenSSL> req -engine pkcs11 -new -key 0:453132 -keyform engine -x509 -out cert.crt -outform DER

...

openssl
 
OpenSSL> engine dynamic -pre SO_PATH:/usr/lib64/engines-1.1/libpkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:/usr/lib64/librtpkcs11ecp.so
 
OpenSSL> req -engine pkcs11 -new -key 0:453132 -keyform engine -out request.req


Создание сертификата и импорт его на токен через OpenSSL 3.x

Настраиваем конфигурационный файл по инструкции
Формируем самоподписанный сертификат или заявку на сертификат:

$ OPENSSL_CONF=/path/to/engine.conf openssl req -engine pkcs11 -x509 -new -key 0:45 3132 -keyform engine -out clientcert.pem crt -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com"

...

pkcs11-tool --module /usr/lib64/librtpkcs11ecp.so -l -y cert -w cert.crt --id 453132

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

Для создания CMS подписи необходимо иметь сертификат.

...

Создание самоподписанного сертификата было описано выше.
В конфигурационный файл openssl.cnf (он может находится по пути /usr/lib/ssl/) необходимо внести следующие изменения:

openssl_conf = openssl_init
 
[openssl_init]
engines = engine_section
 
[engine_section]
pkcs11 = pkcs11_section
 
[pkcs11_section]
engine_id = pkcs11
dynamic_path = /path/to/engine_pkcs11.so //например, /usr/lib/x86_64-linux-gnu/engines-3/libpkcs11.so
MODULE_PATH = /path/to/rtpkcs11ecp.so //например, /usr/lib/librtpkcs11ecp.so
default_algorithms = ALL


Затем создайте CMS подпись используя

Скопируйте папку 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

0:45

"pkcs11:your_pkcs11_uri" -engine pkcs11 -signer cert.

cer

crt

 

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

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

Проверка подписи в формате CMS

openssl cms -verify -binary -in signed_cms -inform PEM -out verified_data -CAfile

demoCA/cacert

cert.

pem

crt -content data_to_sign

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

центра и используется для проверки сертификата подписанта.

Если используется самоподписанный сертификат, то в эту опцию необходимо указать путь к файлу сертификата подписанта.

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

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

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

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

...

openssl dgst -sign seckey.pem -out signature data_to_sign

...

на Рутокене:

openssl dgst -keyform engine -sign

0:45

"pkcs11:your_pkcs11_uri" -engine pkcs11 -out signature data_to_sign

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

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

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

...

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

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

...

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

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


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

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

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

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 3132 --usage-derive

 

openssl cms -encrypt -binary -RSA -in test_data -out encrypted_cms -outform PEM respondent.cer

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

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

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

...

   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