Импорт ключей на Рутокен ЭЦП 2.0

День добрый!

У меня есть приватный ключ, сохраненный в pem-формате, и полученный по связанному с ним запросу сертификат. Алгоритмы ГОСТовские.

Скажите, пожалуйста, есть ли возможность импортировать их на Рутокен ЭЦП 2.0?

Заранее большое спасибо

Re: Импорт ключей на Рутокен ЭЦП 2.0

al_neverov, приветствую.

Уточните, пожалуйста, каким образом были сгенерированы ключи?

Если это ключи формата КриптоПро CSP, то производится копирование средствами криптопровайдера. Токен будет выступать в качестве ключевого хранилища.
Если это ключи формата PKCS#11, то ФСБ запрещает импорт уже сгенерированных неизвлекаемых ключей на токен и последующую работу с ними с использованием криптоядра токена.

(2021-04-21 17:09:09 отредактировано al_neverov)

Re: Импорт ключей на Рутокен ЭЦП 2.0

Ксения, день добрый.

Ключи были сгенерированы bouncy castle. Выяснилось, что импортировать ГОСТ ключ из файла не получится(

Решили перегенерировать запрос и воспользоваться возможностями Рутокен SDK, java.

Генерация ключа по примеру из SDK проходит отлично.

Но стоит что-то поменять, возникают проблемы. Не могли бы Вы помочь нам с ними разобраться, потому что документации по использованию библиотеки в java очень мало


1) Как добавить собственные расширения (они передаются в C_EX_CreateCSR в 10м параметре)? В каком формате они должны формироваться? Можно ли в качестве имени расширения использовать его OID?
Например, мне нужно сформировать расширение 1.2.643.3.123.3.1, значением которого является OCTED STRING. Как это сделать? При добавлении просто строки и OID в качестве имени расширения возникает

Pkcs11Exception: C_EX_CreateCSR failed, error code: 0x6

2) Каким образом указать дополнительные параметры приватного и публичного ключа - эллиптической кривой, дайджеста и т.д.
В примерах есть файл Constant.java, в котором параметры представлены так

public static final byte[] ATTR_CRYPTO_PRO_A_GOSTR3410_2001 = {0x06, 0x07, 0x2A, (byte) 0x85, 0x03, 0x02, 0x02, 0x23, 0x01};

Что это за представление? Как мне, например, указать, что нужно использовать параметр с OID 1.2.643.2.2.35.2?

Может быть где-то существует документация по функциям библиотеки rtpkcs11ecp? Подозреваю, что это ее функции.

Заранее большое спасибо за помощь и информацию

Re: Импорт ключей на Рутокен ЭЦП 2.0

al_neverov, добрый день!

Отвечу по пунктам:
1) Описание функции C_Ex_CreateCSR

В SDK в примере по пути: sdk\pkcs11\samples\PKIExtensions\CreateCSR-PKCS10-GOST34.10-2012-256 показано как передать OCTETSTRING.

2) Чтобы сменить paramset, нужно в шаблонах открытого/закрытого ключа изменить константы в строках:

publicKeyTmpl[6].setAttr(new NativeLong(RtPkcs11Constants.CKA_GOSTR3410_PARAMS), Constants.ATTR_CRYPTO_PRO_A_GOSTR3410_2001);
privateKeyTmpl[7].setAttr(new NativeLong(RtPkcs11Constants.CKA_GOSTR3410_PARAMS), Constants.ATTR_CRYPTO_PRO_A_GOSTR3410_2001);

Значение константы получить очень легко: нужно OID перевести в DER-кодировку. Для этого можно воспользоваться сервисом: https://misc.daniel-marschall.de/asn.1/ … online.php
Т.е для

 szOID_GostR3410_2001_CryptoPro_B_ParamSet "1.2.643.2.2.35.2" 

это будет

{ 0x06, 0x07, 0x2A, 0x85, 0x03, 0x02, 0x02, 0x23, 0x02 }

Re: Импорт ключей на Рутокен ЭЦП 2.0

Павел, вечер добрый!

Большое спасибо за информацию.

В принципе, все получилось) Осталась одна проблема.
В шаблонах ключа задается параметр дайджеста и кривой

privateKeyTemplate3410_2012_256[7].setAttr(new NativeLong(
                RtPkcs11Constants.CKA_GOSTR3410_PARAMS), Constants.ATTR_CRYPTO_PRO_B_GOSTR3410_2012_256); // Parameters of GOST R 34.10-2012 (256 bits) algorithm
        privateKeyTemplate3410_2012_256[8].setAttr(new NativeLong(
                RtPkcs11Constants.CKA_GOSTR3411_PARAMS), Constants.ATTR_GOSTR3411_2012_256); // Parameters of GOST R 34.11-2012 (256) algorithm

В этот же шаблон мне нужно прописать параметр шифрования 1.2.643.2.2.31.1
Константу для него уже сформировал

public final static byte[] ATTR_GOSTR28147_1989 = {0x06, 0x07, 0x2a, (byte) 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01};

Но пока не могу подобрать из RtPkcs11Constants чему ее присвоить. Пробовал вот эту

public static final long CKA_GOST28147_PARAMS = 594L;

но тогда параметры вообще неправильные формируются.

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

Re: Импорт ключей на Рутокен ЭЦП 2.0

День добрый,

в дополнение

формирую параметр вот таким образом

publicKeyTemplate3410_2012_256[8].setAttr(new NativeLong(
                RtPkcs11Constants.CKA_GOST28147_PARAMS), Constants.ATTR_GOSTR28147_1989); // Parameters of GOST R 28147  algorithm

/* ... */

privateKeyTemplate3410_2012_256[9].setAttr(new NativeLong(
                RtPkcs11Constants.CKA_GOST28147_PARAMS), Constants.ATTR_GOSTR28147_1989); // Parameters of GOST R 28147 algorithm

А в запросе на сертификат он не формируется:

https://ibb.co/F5cy3Lw

С чем это может быть связано и что можно с этим сделать? Параметр нужен(

Re: Импорт ключей на Рутокен ЭЦП 2.0

Коллеги, утро доброе.

Так и не получилось включить параметр шифрования в шаблон ключа.
Добавление RtPkcs11Constants.CKA_GOST28147_PARAMS не дает никакого эффекта.

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

Добавил параметр Pkcs11Constants.CKA_ENCRYPT = true в шаблон открытого ключа (пробовал также добавлять его в шаблон закрытого и в оба).

В результате ключевая пара вообще не формируется, возникает ошибка

Pkcs11Exception: C_GenerateKeyPair failed, error code: 0xd1

Подскажите, пожалуйста, как можно добавить параметр 1.2.643.2.2.31.1, чтобы он попал в запрос на сертификат? Без него УЦ сертификат не выдаст(

Re: Импорт ключей на Рутокен ЭЦП 2.0

Коллеги, вечер добрый!

Банк принял запрос на сертификат без этого параметра.
Спасибо Вам огромное за помощь!