Проблема с гененрацией сертификата

Генерируем закрытый ключ программными средствами:

openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -outform DER -out key.der

Запписываем сгенерированный ключ на рутокен ЭЦП:

pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y privkey -w ./key.der --id 13

Запрос на сосздание сертификата:

openssl req -engine pkcs11_gost -new -key 13 -keyform engine -out req.csr

в ответ получаю следующее:

key not found.
PKCS11_get_private_key returned NULL
cannot load Private Key from engine
3073459900:error:80036082:Vendor defined:func(54):Object handle invalid:p11_gost2001.c:311:
3073459900:error:8108F09A:lib(129):PKCS11_LOAD_KEY:key not found:engine_pkcs11.c:1172:
3073459900:error:26096080:engine routines:ENGINE_load_private_key:failed loading private key:eng_pkey.c:126:
unable to load Private Key

Если ключ генерировать аппаратными средствами в токене, то проблем не возникает. Подскажите в чем дело.

Re: Проблема с гененрацией сертификата

Дело в том, что для работы engine pkcs11_gost на Рутокен ЭЦП кроме объекта "закрытый ключ" должен находиться объект "открытый ключ", то есть вся ключевая пара.
В вашем случае вы импортируете на токен только "закрытый ключ", а при генерации создаются 2 этих объекта.

Нюанс в том, что через openssl можно получить открытый ключ по закрытому, но записать этот окрытый ключ на Рутокен ЭЦП посредством pkcs11-tool не получится из-за ограничений этой утилиты.

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

Re: Проблема с гененрацией сертификата

Виктор Ткаченко пишет:

Дело в том, что для работы engine pkcs11_gost на Рутокен ЭЦП кроме объекта "закрытый ключ" должен находиться объект "открытый ключ", то есть вся ключевая пара.
В вашем случае вы импортируете на токен только "закрытый ключ", а при генерации создаются 2 этих объекта.

Нюанс в том, что через openssl можно получить открытый ключ по закрытому, но записать этот окрытый ключ на Рутокен ЭЦП посредством pkcs11-tool не получится из-за ограничений этой утилиты.

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

Спасибо за ответ. Я нашел в исходниках pkcs11-tool, что она позволяет записывать открытый ключ только для алгоритма RSA. Тогда я решил зашить открытый ключ не используя pkcs11-tool. В вашем SDK нашел пример Sign_PKCS7. Пример отработал отлично, но когда я заменил открытый и закрытый ключ своими, то запись открытого ключа не проходит, хотя закрытый записывается нормально.
Бинарные ключи генерирую с помощью openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -text -engine gost.
Складывается ощущение что параметры алгоритма разные в openssl и на рутокине, потому при записе открытого ключа он не проходит проверку? Поясните пожалуйста данную ситуацию.

P.S. С инструментом было бы здорово.
P.S.S. Возможно вы сможете подсказать насчет наличия библиотеки librtpkcs11ecp.so для arm?

Re: Проблема с гененрацией сертификата

А каким способом вы формировали байты открытого ключа в примере?
На основе текстового вывода openssl?

Re: Проблема с гененрацией сертификата

Виктор Ткаченко пишет:

А каким способом вы формировали байты открытого ключа в примере?
На основе текстового вывода openssl?

openssl genpkey -algorithm gost2001 -pkeyopt paramset:A -text -engine gost
В выводе есть приватный ключ в формате peb, далее идет бинарный приватный ключ и публичный ключ как 2 компоненты x и y.
Таким же образом переношу в код сначала байты x  компоненты затем байты y компоненты.

Re: Проблема с гененрацией сертификата

Нужно развернуть байты.

То есть если, например:

X: 74 ... FB
Y: DF ... DE

То буфер для записи должен выглядеть:

FB ... 74 DE ... DF

Ну или, чтобы не мучиться сделать так:

openssl pkey -engine gost -in key.der -inform DER -pubout -outform DER > key.pub

dumpasn1 key.pub

и в дампе вы увидите байты открытого ключа в нужном порядке

Re: Проблема с гененрацией сертификата

Виктор Ткаченко пишет:

Нужно развернуть байты.

То есть если, например:

X: 74 ... FB
Y: DF ... DE

То буфер для записи должен выглядеть:

FB ... 74 DE ... DF

Ну или, чтобы не мучиться сделать так:

openssl pkey -engine gost -in key.der -inform DER -pubout -outform DER > key.pub

dumpasn1 key.pub

и в дампе вы увидите байты открытого ключа в нужном порядке

Спасибо.

Re: Проблема с гененрацией сертификата

Мы собрали pkcs11-tool, который позволяет записывать открытый ключ на Рутокен ЭЦП.
Могу выслать по запросу.

Re: Проблема с гененрацией сертификата

Вышлите на почту указанную в профиле, появились ли у вас версии библиотек под arm?

Re: Проблема с гененрацией сертификата

Виктор Ткаченко пишет:

Мы собрали pkcs11-tool, который позволяет записывать открытый ключ на Рутокен ЭЦП.
Могу выслать по запросу.

Пришлите пожалуйста версию pkcs11-tool, который позволяет записывать открытый ключ на Рутокен ЭЦП.

Re: Проблема с гененрацией сертификата

Пытаюсь выслать вам на указанный при регистрации email, но не получается.

Re: Проблема с гененрацией сертификата

Виктор Ткаченко пишет:

Пытаюсь выслать вам на указанный при регистрации email, но не получается.

Открыл почту.

Re: Проблема с гененрацией сертификата

Ссылка на необходимый патч к pkcs11-tool
https://github.com/OpenSC/OpenSC/compar … ool-pubkey