* Найти сертификат на токене

Добрый день.
win 7 x64 .Microsoft Visual C++ 2005.
Пользуем пример SignPKCS7-GOST34.10-2012-256.

printf(" Getting certificate...\n");
    r = findObjects(functionList, session, certificateTemplate, arraysize(certificateTemplate),
                    &certificates, &certificatesCount);

сертификат не находится
findObjects возвращает 0
certificatesCount получает 0.
хотя при этом закрытый ключ находится.
И еще
отладчик фиксирует много исключений

Исключение Microsoft C++: unsigned long по адресу 0x0018fb90..

это одного вида
и при поиске объектов фиксируется

Исключение Microsoft C++: LoadingObjectFailedException по адресу 0x0018fa44..
Первый экземпляр исключения в "0x75e6c54f" в "prba3_sign.exe": Исключение Microsoft C++: LoadingObjectFailedException по адресу 0x0018f690..
Первый экземпляр исключения в "0x75e6c54f" в "prba3_sign.exe": Исключение Microsoft C++: [rethrow] по адресу 0x00000000..
Первый экземпляр исключения в "0x75e6c54f" в "prba3_sign.exe": Исключение Microsoft C++: LoadingObjectFailedException по адресу 0x0018fa44..

Re: * Найти сертификат на токене

Добрый день, wert.

Давайте в начале с примером разберемся. При использовании примера без изменений:

  • Ключи и сертификат находятся? Что в шаблоне для поиска сертификата и ключа соответственно?

  • Пришлите скриншот из Панели управления Рутокен из вкладки сертификаты

  • Исключения возникают, если Вы используете наш пример?

(2019-02-04 08:17:47 отредактировано wert)

Re: * Найти сертификат на токене

Пример Ваш , единственно скопирован в проект.

CK_ATTRIBUTE certificateTemplate[] =
{
    { CKA_CLASS, &certificateObject, sizeof(certificateObject) },                      // Класс - сертификат
    { CKA_TOKEN, &attributeTrue, sizeof(attributeTrue) },                              // Сертификат является объектом токена
    { CKA_ID, &keyPairIdGost2012_256_1, sizeof(keyPairIdGost2012_256_1) - 1},        // Идентификатор ключевой пары, которой соответствует сертификат
    { CKA_CERTIFICATE_TYPE, &certificateType, sizeof(certificateType) },               // Тип сертификата - X.509
    { CKA_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate) } // Категория сертификата - пользовательский
};
static CK_BYTE keyPairIdGost2012_256_1[] = { "7E81C630DFB080E8" };

Re: * Найти сертификат на токене

https://forum.rutoken.ru/uploads/images/2019/02/13dddc8ec802793df269e210dffd4762.png

Re: * Найти сертификат на токене

по поводу исключений чтобы было более понятно
https://forum.rutoken.ru/uploads/images/2019/02/52f4c2917b1f9acecec1c5bd501ec929.png

Re: * Найти сертификат на токене

Добрый день, wert.

  • В вашем шаблоне задан CKA_ID. А то поле, которое Вы показываете на скрине из Панели управления Рутокен это CKA_LABEL. Эти поля совсем не обязаны совпадать. Проверяйте, какой у этого ключа CKA_ID.

  • Судя по названию примера SignPKCS7-GOST34.10-2012-256, Вы используете не последнюю версию SDK. Мы настоятельно рекомендуем использовать при встраивании последнюю версию. Мы постоянно улучшаем наши продукты, добавляем новые функции и исправляем проблемы.

  • Те исключения, которые Вы видите в MSVC похоже бросает сервис смарт-карт Windows - winscard

Re: * Найти сертификат на токене

CKA_ID это то что выделено ?
https://forum.rutoken.ru/uploads/images/2019/02/5bba5fa954938fc70580668edd396a22.png

Re: * Найти сертификат на токене

Добрый день, wert.

То, что выделено это ID сертификата. CKA_ID это термин стандарта PKCS#11.
В общем случае, Вам не надо искать сертификаты\ключи с конкретным ID. Обычно перебирают все имеющиеся, а потом уже выбирают те, которые нужны.

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

Re: * Найти сертификат на токене

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

Re: * Найти сертификат на токене

Добрый день, wert.

Для проверки работы, например, для ГОСТ 34.10-2012 выполняйте последовательно примеры:

  • CreateGOST34.10-2012-512, SignVerifyGOST34.10-2012-512 для "сырой" подписи

  • CreateGOST34.10-2012-512, CreateCSR-PKCS10-GOST34.10-2012-512, ImportCertificate-GOST34.10-2012-512, SignPKCS7-GOST34.10-2012-512,  VerifyPKCS7

Re: * Найти сертификат на токене

Спасибо, попробуем.

Re: * Найти сертификат на токене

И все таки про  CKA_ID
номер что на ключе напечатан и получаемый по  tokenInfo.serialNumber , он как то связан с ним , и если нет то как добыть CKA_ID.

Re: * Найти сертификат на токене

Добрый день, wert.

Давайте еще раз.
tokenInfo.serialNumber это серийный номер устройства. Он напрямую связан с номером, напечатанным на токене - это его hex представление.
CKA_ID - это id объекта на токене, например, файла или сертификата. Подробнее о том, что это за id и зачем он нужен написано в стандарте PKCS#11. Этот id можно узнать у конкретного объекта или осуществлять поиск по этому id из всех объектов на токене с помощью функций PKCS#11.
Эти 2 сущности никак не связаны между собой.

(2019-02-05 15:39:21 отредактировано wert)

Re: * Найти сертификат на токене

спасибо.

В вашем шаблоне задан CKA_ID. А то поле, которое Вы показываете на скрине из Панели управления Рутокен это CKA_LABEL. Эти поля совсем не обязаны совпадать. Проверяйте, какой у этого ключа CKA_ID.

тобиш в моём случае , получается что CKA_LABEL совпало с CKA_ID иначе бы findObjects не нашел бы закрытый ключ по шаблому со CKA_ID для поиска ? Если это так, почему findObjects  не ищет сертификат на ключе по значению из CKA_LABEL совпавшему со CKA_ID закрытого ключа, и также тоже совпавшему со CKA_ID сертификата  .

Подсказанные вами примеры еще не побывал.

Re: * Найти сертификат на токене

Добрый день, wert.

Без полной информации о имеющихся у Вас объектов я могу только делать предположения. Скорее всего в вашем закрытом ключе CKA_LABEL совпадает с CKA_ID, а в сертификате нет. Поэтому поиск и не проходит.