Page tree

Versions Compared

Key

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

...

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

 

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

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

# для red os
sudo yum update
sudo yum install ccid opensc gdm-plugin-smartcard p11-kit
 
# для alteros
sudo yum update
sudo yum install ccid opensc gdm-plugin-smartcard p11-kit openssl-pkcs11
 
# для astra и alt linux
sudo apt-get update
sudo apt-get install ccid opensc gdm-plugin-smartcard p11-kit
 
# для rosa
sudo dnf --auto-update
sudo dnf install ccid opensc 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/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 45id 3132

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

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

...

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_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 подписи необходимо иметь сертификат. В тестовых целях можно воспользоваться нашим SDK.
В папке
sdk\openssl\samples\tool\ предоставлены настройки удостоверяющего центра OpenSSL, который позволяет выпускать сертификаты.Скопируйте папку sdk\openssl\samples\tool\demoCA и конфигурационный файл openssl.cnf в папку с OpenSSL (она Создание самоподписанного сертификата было описано выше.
В конфигурационный файл 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 подпись используя

...

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

 

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

...

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

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

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

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

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

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

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

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

...

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

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 -verify pubkey.pem -signature signature data_to_sign

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

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

...

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

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

pkcs11-tool .exe --module rtPKCS11ECP.dll --login --pin 12345678 --/usr/lib/librtpkcs11ecp.so --keypairgen --key-type GOSTR3410-2012-256:B rsa:2048 -l --id 3132 3132--usage-derive

 

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

...

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

...

   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 0:45 "pkcs11:your_pkcs11_uri" -engine rtengine -out decrypted_cms_data

...