Пример для записи сертификата (и ключа) для PKCS

Добрый день,

Скажите, пожалуйста, а есть ли пример по записи пары сертификат-ключ средствами библиотеки PKCS? Сертификат мне записать удалось (правда, он на токене не появляется, но хотя бы запись без ошибок проходит) со следующими параметрами:

CK_CERTIFICATE_TYPE certType = CKC_X_509;
CK_ATTRIBUTE CertTmpl[] =
{
    { CKA_CLASS, &ocCert, sizeof(ocCert) },                          // Объект сертификата
    { CKA_CERTIFICATE_TYPE, &certType, sizeof(certType) },
    { CKA_ID, &KeyPairIDGOST1, sizeof(KeyPairIDGOST1)-1 },         // Идентификатор сертификата
    { CKA_TOKEN, &bTrue, sizeof(bTrue) },                            // Сертификат является объектом токена
    { CKA_PRIVATE, &bFalse, sizeof(bFalse) },                        // Сертификат доступен без авторизации на токене
    { CKA_VALUE, byteCertData, certData->Length }             // Значение сертификата
};

а вот на ключ - при вызове возвращается ошибка  D0 (некорректный набор параметров)
CK_ATTRIBUTE PrivateTmpl[] =
    {
        { CKA_CLASS, &ocPrivKey, sizeof(ocPrivKey) },                          // Объект сертификата
        { CKA_ID, &KeyPairIDGOST1, sizeof(KeyPairIDGOST1)-1 },         // Идентификатор сертификата
        { CKA_TOKEN, &bTrue, sizeof(bTrue) },                            // Сертификат является объектом токена
        { CKA_PRIVATE, &bFalse, sizeof(bFalse) },                        // Сертификат доступен без авторизации на токене
        { CKA_VALUE, bytePrivateKey, privateKey->Length }             // Значение сертификата
};


Подскажите, пожалуйста, чего еще не хватает?

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

Заранее спасибо за помощь!

Re: Пример для записи сертификата (и ключа) для PKCS

Добрый день.

Токен у вас Рутокен ЭЦП?
А что значит "правда, он на токене не появляется" ? Как вы определяете что не появился? Если не появился - скорее всего значит не записан.

Ключ импортировать сложнее, нужно обязательно указать парамсет, KEY_TYPE и передать значение VALUE правильно.
Если токен обнаружит несоответствие - импорт не пройдет.

Re: Пример для записи сертификата (и ключа) для PKCS

Добрый вечер, Кирилл.

Токены у нас - Rutoken S 32K

Отсутствие сертификата - определяю через Панель управления Rutoken - его там не видно. А считаю что записался (хоть как-то) - pFunctionList->C_CreateObject возвращает CKR_OK.

Может быть, я вообще использую неверный подход и pfx надо записывать как-то по-другому?

Re: Пример для записи сертификата (и ключа) для PKCS

Рутокен S для этого совсем не подходит.
Без криптопровайдеров (через PKCS11) эта модель поддерживает (да и то очень ограниченно) лишь RSA сертификаты.
Вы записываете ГОСТ сертификат как RSA и поэтому панель управления его не видит, так как она видит только правильные RSA сертификаты (ваш неправильный, потому что ГОСТ)

Подход правильный, но неправильный выбор инструментария.
В случае с Рутокеном ЭЦП - так как вы делаете, делать можно.

В случае Рутокен S нужно пользоваться криптопровайдером. (криптопро, випнет, лисси)

Re: Пример для записи сертификата (и ключа) для PKCS

Я и записываю RSA сертификат - CK_CERTIFICATE_TYPE certType = CKC_X_509.
От ГОСТа осталось только название (как я предполагаю). Или в поле CKA_ID так же задается тип сертификата?

К сожалению, поменять тип токена невозможно - куплено около 1000 именно S-ок.

Re: Пример для записи сертификата (и ключа) для PKCS

При этом, напомню, что тот же PFX через панель управления прекрасно записывается.

Re: Пример для записи сертификата (и ключа) для PKCS

Допустим вам удалось обмануть токен и записать ГОСТ сертификат как RSA.
Дальше то вы все равно не продвинетесь.
ГОСТ ключи через PKCS11 записать нельзя, да и какой смысл их записывать если токен не поддерживает аппаратную криптографию?

Re: Пример для записи сертификата (и ключа) для PKCS

Я ориентировался на то, что у вас в коде написано gost.

Если вы импортируете PFX на Рутокен S через панель управления и импорт проходит - значит это RSAшный PFX

Re: Пример для записи сертификата (и ключа) для PKCS

да, я и говорю - записываем обычный RSA.
CK_CERTIFICATE_TYPE certType = CKC_X_509

От ГОСТа там осталось только { CKA_ID, &KeyPairIDGOST1, sizeof(KeyPairIDGOST1)-1 }, но, насколько я понимаю, это просто текстовый лейбл для сертификата, или я не прав?

Re: Пример для записи сертификата (и ключа) для PKCS

сам ID ни на что не влияет
вам все таки нужно записывать RSAшный PFX?

Re: Пример для записи сертификата (и ключа) для PKCS

Да. Есть RSA PFX, прекрасно записывается через панель. Я пишу нашу "внутреннюю" оболочку, чтобы потоково форматировать ключи, устанавливать PIN-код и записывать на них сертификаты, вытягивая их с сервера по номеру ключа.
С номером ключа разобрался, с форматированием тоже.
Сам PFX я разбираю на сертификат и закрытый ключ. Проблема в том, чтобы их теперь записать на ключ.

Re: Пример для записи сертификата (и ключа) для PKCS

Теперь понятно :)
Теоретически PFX контейнер можно распарсить и записать через PKCS11, однако я бы не рекомендовал это делать, это довольно сложно и там очень легко будет ошибиться.

Лучше воспользуйтесь импортом через криптопровайдер "Aktiv rutoken" и функции cryptoapi
Вот я нашел для вас ссылку http://stackoverflow.com/questions/2382 … rd-c-sharp

Re: Пример для записи сертификата (и ключа) для PKCS

Ок, спасибо большое, попробую разобраться!

Re: Пример для записи сертификата (и ключа) для PKCS

Вот порядок вызова CryptoApi функций
https://forum.rutoken.ru/post/9006/#p9006

Re: Пример для записи сертификата (и ключа) для PKCS

Добрый вечер всем.
Спасибо за помощь, после некоторой паузы я вернулся к проекту и реализовал запись на ключ через CryptoApi. Но есть одна проблема - запрос PIN-кода при вызове CryptAcquireContext.
Может кто подскажет - возможно ли его передавать как-то программно?