Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Здравствуйте!

Установил rtengine 1.4.2 как сказано в инструкции: https://dev.rutoken.ru/pages/viewpage.a … d=89096210
Версия OpenSSL  = 1.1.1f
Конфигурационный файл openssl.cnf:

openssl_conf = openssl_def
---***---
[openssl_def]
engines = engine_section

[engine_section]
rtengine = gost_section

[gost_section]
#engine_id = rtengine
dynamic_path = /usr/lib/x86_64-linux-gnu/librtengine.so
pkcs11_path = /usr/lib/librtpkcs11ecp.so
rand_token = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;id=048883ad0cce9ce51ea7206c8f7d629a6bfdeb22
default_algorithms = CIPHERS, DIGEST, PKEY
enable_rand = yes

Пробую создать подпись:

openssl dgst -keyform engine -sign "pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;id=048883ad0cce9ce51ea7206c8f7d629a6bfdeb22" -engine rtengine -out signature.txt text.txt

меня спрашивает PIN-code, я ввожу: 12345678, на что получаю ошибку:

~/xml/folder_xml$ openssl dgst -keyform engine -sign "pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;id=048883ad0cce9ce51ea7206c8f7d629a6bfdeb22" -engine rtengine -out signature.txt text.txt
engine "rtengine" set.
Enter PKCS#11 token PIN:
cannot load key file from engine
140596479698240:error:81107067:lib(129):find_keypair:could not find public key:/home/jenkins/newjenkins/workspace/rtengine-build/2bbfba9d/engine/standalone/standalone.c:443:
140596479698240:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:../crypto/engine/eng_pkey.c:77:
unable to load key file

Подскажите, пожалуйста, с чем может быть связана данная ошибка?
PS: очень интересный путь в выводе ошибки: /home/jenkins/newjenkins/...

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Добрый день.
Можете прислать вывод команды pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -O -l

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Добрый день!

rand_token = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;id=048883ad0cce9ce51ea7206c8f7d629a6bfdeb22

Здесь нужен идентификатор токена, а не объекта, например

rand_token = pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;serial=2adc8d87
vanobl пишет:

Пробую создать подпись:

openssl dgst -keyform engine -sign "pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;id=048883ad0cce9ce51ea7206c8f7d629a6bfdeb22" -engine rtengine -out signature.txt text.txt

Убедитесь, что правильно указываете url приватного ключа. Правильные url объектов показывает, например, утилита p11tool (пакет gnutls-bin):

p11tool --provider '/usr/lib/librtpkcs11ecp.so' --list-privkeys --login --set-pin 12345678
Object 0:
    URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=40636e48;token=Rutoken%20ECP%20%3Cno%20label%3E;id=%50%6C%75%67%69%6E%33%30%30%35%32%30%32%32%31%39%34%36%31%35;object=%00;type=private
    Type: Private key
    Label: 
    Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; 
    ID: 50:6c:75:67:69:6e:33:30:30:35:32:30:32:32:31:39:34:36:31:35

Object 1:
    URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=40636e48;token=Rutoken%20ECP%20%3Cno%20label%3E;id=%50%6C%75%67%69%6E%33%30%30%35%32%30%32%32%31%39%33%32%32%37;object=%00;type=private
    Type: Private key
    Label: 
    Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; 
    ID: 50:6c:75:67:69:6e:33:30:30:35:32:30:32:32:31:39:33:32:32:37

В полном url необходимости нет; достаточно указать model и id.

vanobl пишет:

PS: очень интересный путь в выводе ошибки: /home/jenkins/newjenkins/...

Приятно, что пользователи и партнеры позитивно относятся к современным практикам разработки, в том числе к использованию Continuous Integration.

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Здравствуйте!
Я разобрался с проблемой. Теперь всё работает отлично.
Ошибка была в не правильном указании пути к токену

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Здравствуйте. Похожая проблема.
Версия рутокена ЭЦП 3.0
Openssl пробовал двух версий 3.0 и 1.1.1

Пробую подписать

openssl dgst -keyform engine -sign pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=43757ca9;token=Rutoken%20ECP%20%3Cno%20label%3E;id=%CA%E8%C0%DA%A2%87%9C%94%33%6F%79%06%4D%B8%92%71" -engine rtengine -out /tmp/test.sgn /tmp/test

получаю ошибку:

cannot load key file from engine
140342137233984:error:81108064:lib(129):find_object:ambiguous p11 uri:engine/standalone/standalone.c:419:
140342137233984:error:81107067:lib(129):find_keypair:could not find public key:engine/standalone/standalone.c:450:
140342137233984:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:crypto/engine/eng_pkey.c:77:
unable to load key file

на токене два приватных ключа.
p11tool по этому же uri отдает один ключ.

В чем может быть ошибка?

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

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

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Аверченко Кирилл пишет:

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

Попробовал конвертировать, получаю не читаемый набор символов "ÊèÀÚ¢‡œ”3oyM¸’q"
openssl отдает ошибку

402775F974710000:error:40800067:lib(129):ERR_RTENG_error:could not find public key:engine/standalone/standalone.c:450:

вывод p11tool --provider '/usr/lib/librtpkcs11ecp.so' --list-privkeys --login

Token 'Rutoken ECP <no label>' with URL 'pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=43757ca9;token=Rutoken%20ECP%20%3Cno%20label%3E' requires user PIN
Enter PIN: 
Object 0:
    URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=43757ca9;token=Rutoken%20ECP%20%3Cno%20label%3E;id=%CA%E8%C0%DA%A2%87%9C%94%33%6F%79%06%4D%B8%92%71;object=RSA;type=private
    Type: Private key (RSA-4096)
    Label: RSA
    Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; 
    ID: ca:e8:c0:da:a2:87:9c:94:33:6f:79:06:4d:b8:92:71

Object 1:
    URL: pkcs11:model=Rutoken%20ECP;manufacturer=Aktiv%20Co.;serial=43757ca9;token=Rutoken%20ECP%20%3Cno%20label%3E;id=%45%EA%17%20%EC%7A%99%35%0C%DB%99%3F%83%86%72%56;object=RSA;type=private
    Type: Private key (RSA-4096)
    Label: RSA
    Flags: CKA_PRIVATE; CKA_NEVER_EXTRACTABLE; CKA_SENSITIVE; 
    ID: 45:ea:17:20:ec:7a:99:35:0c:db:99:3f:83:86:72:56

Re: Рутокен ЭЦП 2.0 + OpenSSL + rtengine

Попробуйте поменять id на другие командами:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --pin <ваш пин-код> --set-id <новый id, например, 3132> --id <id нужной пары> --type privkey
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --pin <ваш пин-код> --set-id <новый id, например, 3132> --id <id нужной пары> --type pubkey
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --pin <ваш пин-код> --set-id <новый id, например, 3132> --id <id нужной пары> --type cert

А потом в openssl указать id 12