"unknown key type" на динамически подключеном rtengine

Пытаюсь проверить работу rtengine в openssl.

Окружение: все dll и exe из свежего sdk. Windows10. Имею экземпляр Рутокен ЭЦП с импортированной на него неэкспортируемой ключевой парой.

c:\Work\git\usb_test\test>openssl
OpenSSL> engine dynamic -pre SO_PATH:c:\Work\git\usb_test\test\rtengine.dll -pre ID:rtengine -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:c:\Work\git\usb_test\test\rtpkcs11ecp.dll
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:c:\Work\git\usb_test\test\rtengine.dll
[Success]: ID:rtengine
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:c:\Work\git\usb_test\test\rtpkcs11ecp.dll
Loaded: (rtengine) Rutoken engine
OpenSSL> engine -t
(dynamic) Dynamic engine loading support
     [ unavailable ]
(capi) CryptoAPI ENGINE
     [ available ]
(rtengine) Rutoken engine
     [ available ]
OpenSSL> s_client -connect myownsite:1446  -CAfile g:\share\2313\ca.crt -keyform engine -key "pkcs11:id=ef3f68e6-28dd-4155-b88f-8888a6b8a5a6_E" -engine rtengine
engine "rtengine" set.
Enter PKCS#11 token PIN:
cannot load client certificate private key file from engine
10748:error:8206D0D6:lib(130):init_algorithm_nid:unknown key type:C:\j\workspace\rtengine-build\e458e80a\engine\p11\gost_key.c:56:
10748:error:8207E0DF:lib(130):rt_eng_get0_ec_key:wrong key:C:\j\workspace\rtengine-build\e458e80a\engine\ec.c:59:
10748:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:crypto\engine\eng_pkey.c:78:
unable to load client certificate private key file
error in s_client

А вообще конечная цель это подключить rutoken к qt(С++) проекту и проходить c помощью токенов авторизацию на сервере. Процедура успешно обкатана в браузерах.
Пробовал 2 варианта:
1) На динамическом подключении (через функции ENGINE_ctrl_cmd_string) получаю ту же ошибку unknown key type.
2) При использовании кода вида

rt_eng_init();e = rt_eng_get0_engine();ENGINE_set_default(e, ENGINE_METHOD_ALL);

при вызове ENGINE_load_private_key получаю ошибку "no load function". Также не смог понять как в этом случае в инициализацию передать адрес до библиотеки rtpkcs11ecp.dll. Откуда он пытается её взять?

Re: "unknown key type" на динамически подключеном rtengine

Иван Силантьев пишет:

Пытаюсь проверить работу rtengine в openssl.

Окружение: все dll и exe из свежего sdk. Windows10. Имею экземпляр Рутокен ЭЦП с импортированной на него неэкспортируемой ключевой парой.

c:\Work\git\usb_test\test>openssl
OpenSSL> engine dynamic -pre SO_PATH:c:\Work\git\usb_test\test\rtengine.dll -pre ID:rtengine -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:c:\Work\git\usb_test\test\rtpkcs11ecp.dll
(dynamic) Dynamic engine loading support
[Success]: SO_PATH:c:\Work\git\usb_test\test\rtengine.dll
[Success]: ID:rtengine
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:c:\Work\git\usb_test\test\rtpkcs11ecp.dll
Loaded: (rtengine) Rutoken engine
OpenSSL> engine -t
(dynamic) Dynamic engine loading support
     [ unavailable ]
(capi) CryptoAPI ENGINE
     [ available ]
(rtengine) Rutoken engine
     [ available ]
OpenSSL> s_client -connect myownsite:1446  -CAfile g:\share\2313\ca.crt -keyform engine -key "pkcs11:id=ef3f68e6-28dd-4155-b88f-8888a6b8a5a6_E" -engine rtengine
engine "rtengine" set.
Enter PKCS#11 token PIN:
cannot load client certificate private key file from engine
10748:error:8206D0D6:lib(130):init_algorithm_nid:unknown key type:C:\j\workspace\rtengine-build\e458e80a\engine\p11\gost_key.c:56:
10748:error:8207E0DF:lib(130):rt_eng_get0_ec_key:wrong key:C:\j\workspace\rtengine-build\e458e80a\engine\ec.c:59:
10748:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:crypto\engine\eng_pkey.c:78:
unable to load client certificate private key file
error in s_client

А вообще конечная цель это подключить rutoken к qt(С++) проекту и проходить c помощью токенов авторизацию на сервере. Процедура успешно обкатана в браузерах.
Пробовал 2 варианта:
1) На динамическом подключении (через функции ENGINE_ctrl_cmd_string) получаю ту же ошибку unknown key type.
2) При использовании кода вида

rt_eng_init();e = rt_eng_get0_engine();ENGINE_set_default(e, ENGINE_METHOD_ALL);

при вызове ENGINE_load_private_key получаю ошибку "no load function". Также не смог понять как в этом случае в инициализацию передать адрес до библиотеки rtpkcs11ecp.dll. Откуда он пытается её взять?

Здравствуйте, Иван!

rtengine работает только с неизвлекаемыми ключами формата PKCS#11. Они создаются внутри памяти устройства и не могут быть экспортированы. Все криптооперации с ними происходят внутри внутреннего криптоядра.

Чтобы создать такие ключи можно воспользоваться pkcs11-tool из состава OpenSC. Если программно - см. пример из Комплекта разработчика <sdk>\openssl\rtengine\samples\KeyGeneration

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



Скорее всего вы пытаетесь работать с контейнерами сторонних криптопровайдеров вроде КриптоПро, VipNet и др.

Re: "unknown key type" на динамически подключеном rtengine

Павел Анфимов пишет:

rtengine работает только с неизвлекаемыми ключами формата PKCS#11. Они создаются внутри памяти устройства и не могут быть экспортированы. Все криптооперации с ними происходят внутри внутреннего криптоядра.

Чтобы создать такие ключи можно воспользоваться pkcs11-tool из состава OpenSC. Если программно - см. пример из Комплекта разработчика <sdk>\openssl\rtengine\samples\KeyGeneration

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



Скорее всего вы пытаетесь работать с контейнерами сторонних криптопровайдеров вроде КриптоПро, VipNet и др.

Панель управления Рутокен выдаёт следующее:
https://forum.rutoken.ru/uploads/images/2019/10/81bf80b493c27ba28d688a3ce8c08292.png

id я вероятно подобрал правильно, т.к. в противном случае он явно говорит что id неправильный. И да, конвертирование ASСII даёт его же.

Импортировал ключевую пару на токен из .pfx, а вот какими средствами был сгенерирован .pfx пока затрудняюсь ответить(это важно?)

Re: "unknown key type" на динамически подключеном rtengine

Иван Силантьев пишет:
Павел Анфимов пишет:

rtengine работает только с неизвлекаемыми ключами формата PKCS#11. Они создаются внутри памяти устройства и не могут быть экспортированы. Все криптооперации с ними происходят внутри внутреннего криптоядра.

Чтобы создать такие ключи можно воспользоваться pkcs11-tool из состава OpenSC. Если программно - см. пример из Комплекта разработчика <sdk>\openssl\rtengine\samples\KeyGeneration

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



Скорее всего вы пытаетесь работать с контейнерами сторонних криптопровайдеров вроде КриптоПро, VipNet и др.

Панель управления Рутокен выдаёт следующее:
https://forum.rutoken.ru/uploads/images/2019/10/81bf80b493c27ba28d688a3ce8c08292.png

id я вероятно подобрал правильно, т.к. в противном случае он явно говорит что id неправильный. И да, конвертирование ASСII даёт его же.

Импортировал ключевую пару на токен из .pfx, а вот какими средствами был сгенерирован .pfx пока затрудняюсь ответить(это важно?)

Иван, rtengine работает исключительно с ГОСТ-ключами и сертификатами, а "Aktiv Rutoken CSP v1.0" создает RSA-объекты.