Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Здравствуйте. В SDK есть пример по получению  информации о сертификате на токене. Возможно ли и как, если это возможно, получить определённую информацию, например, если меня интересует только серийный номер сертификата или, допустим, алгоритм? Подскажите, пожалуйста, как работать с этой информацией. Интересует код C++. Буду рад любой помощи. Спасибо.

rv = functionListEx->C_EX_GetCertificateInfoText(session, certificates[0], &info, &size);
        CHECK_AND_LOG(" C_EX_GetCertificateInfoText", rv == CKR_OK, rvToStr(rv), logout);

        /*************************************************************************
        * Распечатать буфер, содержащий информацию о сертификате                 *
        *************************************************************************/
        r = printUTF8String(info);
        CHECK(" Print info", r == 0, free_buffer);

        printf("Information has been acquired successfully.\n");

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Binger пишет:

Здравствуйте. В SDK есть пример по получению  информации о сертификате на токене. Возможно ли и как, если это возможно, получить определённую информацию, например, если меня интересует только серийный номер сертификата или, допустим, алгоритм? Подскажите, пожалуйста, как работать с этой информацией. Интересует код C++. Буду рад любой помощи. Спасибо.

rv = functionListEx->C_EX_GetCertificateInfoText(session, certificates[0], &info, &size);
        CHECK_AND_LOG(" C_EX_GetCertificateInfoText", rv == CKR_OK, rvToStr(rv), logout);

        /*************************************************************************
        * Распечатать буфер, содержащий информацию о сертификате                 *
        *************************************************************************/
        r = printUTF8String(info);
        CHECK(" Print info", r == 0, free_buffer);

        printf("Information has been acquired successfully.\n");

Добрый день!

Отдельно указать, что выводить из полей сертификата функции C_EX_GetCertificateInfoText нельзя. Но формат в котором выводится результат стандарный, поэтому его легко разбирать на подстроки.
Например, серийный номер будет вседа перед строкой "Serial Number:", а алгортим подписи перед "Signature Algorithm:".

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Павел Анфимов, Спасибо, Павел)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Здравствуйте! Можно узнать, что нужно сделать, чтобы этот код заработал? Что нужно импортировать в проект? Где что скачать?

(2019-10-31 17:16:26 отредактировано MarErm)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Binger, Можно Вас попросить помочь найти этот пример в SDK, если не сложно. Спасибо!

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Добрый день. Например этот файл: sdk\pkcs11\samples\PKIExtensions\GetCertificateInfo-GOST34.10-2012-256\GetCertificateInfo-GOST34.10-2012-256.c

С уважением, Алексей Лазарев, Компания "Актив"

(2019-11-04 14:56:20 отредактировано MarErm)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Алексей Лазарев пишет:

Добрый день. Например этот файл: sdk\pkcs11\samples\PKIExtensions\GetCertificateInfo-GOST34.10-2012-256\GetCertificateInfo-GOST34.10-2012-256.c

Алексей, спасибо!
Можно уточнить про этот код:
```
    * Выполнить аутентификацию Пользователя                                  *
    *************************************************************************/
    rv = functionList->C_Login(session, CKU_USER, USER_PIN, USER_PIN_LEN);
    CHECK_AND_LOG(" C_Login", rv == CKR_OK, rvToStr(rv), close_session);
    printf("Initialization has been completed successfully.\n");
```

1) Можно ли прочитать информацию о сертификате без аутентификации Пользователя?
2) CKU_USER = #define CKU_USER  1, что такое CKU_USER? Это учетная запись Windows?
3) Можно ли в GOLANG использовать библиотеку PKCS#11 с помощью CGo? Если создавать exe файл через GOLANG, библиотека будет внутри вместе с остальным кодом?
4) Чтобы включить нужный токен, требуется отключить в данный момент ненужный. Как правильно проверить, что в момент отключения токен не используется?

Пояснение:
Мы решаем проблему ограничения максимального количества подключенных смарт-карт в Widnows 10. Использовать Windows 7 мы больше не можем, т. к. у этой ОС заканчивается поддержка в 2019 г.

Элементы разрабатываемой системы:
1) Библиотека PKCS#11 - для получения информации о сертификатах;
2) Утилита Devcon - для управления смарт-картами;

Основной используемый язык - GOLANG

(2019-11-05 14:53:00 отредактировано Алексей Лазарев)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Добрый день,

1) Да, информация о сертификате доступна без логина пользователя
2) CKU_USER - это тип пользователя. В данном случае значение соответствует обычному пользователю токена.
3) Теоретически - это возможно, но мы не пробовали.
4) Для этого нужно знать, какие процессы дергают токен. Из API - никак, если это чужие процессы.

С уважением, Алексей Лазарев, Компания "Актив"

(2019-11-06 20:31:32 отредактировано MarErm)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Алексей Лазарев пишет:

Добрый день,
4) Для этого нужно знать, какие процессы дергают токен. Из API - никак, если это чужие процессы.

Во время выполнения каких-либо действий токен всегда моргает. Во всяком случае, мы перед ручным извлечением всегда проверяем, чтобы токен не моргал. У нас в основном используются Рутокены ЭЦП 2.0. Значит, есть какой-то признак выполнения? Как можно его получить?

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Добрый день.

Специального способа определить нет. Но в теории, можно хучить вызовы Winscard.dll примерно так, как это делают снифферы APDU.

С уважением, Алексей Лазарев, Компания "Актив"

(2019-11-11 10:19:20 отредактировано MarErm)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Здравствуйте!
Можете, пожалуйста, подсказать, пытаюсь прочитать данные с сертификата, но получаю ошибку. На токене сертификат точно есть. Рутокен ЭЦП 2.0. Проверил еще на Рутокене Лайт, то же самое. В чем может быть причина ошибки?


Initialization...
 LoadLibrary -> OK
 GetProcAddress (C_GetFunctionList) -> OK
 GetProcAddress (C_EX_GetFunctionListExtended) -> OK
 Get function list -> OK
 Get function list extended -> OK
 C_Initialize -> OK
 C_GetSlotList (number of slots) -> OK
 Checking available tokens -> OK
 Memory allocation for slots -> OK
 C_GetSlotList -> OK
 Slots available: 1
 C_OpenSession -> OK
 C_Login -> OK
Initialization has been completed successfully.

Getting information...
 Getting certificates...
  C_FindObjectsInit -> OK
  Memory allocation for object handles -> OK
  C_FindObjects -> OK
  C_FindObjectsFinal -> OK
 findObjects -> OK
 Checking number of certificates -> Failed
No objects found

 C_Logout -> OK
 C_CloseSession -> OK
 C_Finalize -> OK
 FreeLibrary -> OK


Some error occurred. Sample failed.

Еще перед выполнением программы вот такие предупреждения посыпались.

In file included from ./pkcs11.h:261,
                 from ./cryptoki.h:80,
                 from ./rtpkcs11.h:12,
                 from ./Common.h:34,
                 from .\SertInfo.go:3:
./pkcs11f.h:34:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:44:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:53:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:63:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:77:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:88:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:99:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:111:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:123:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:136:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:147:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:160:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:177:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:187:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:196:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:206:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:218:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:232:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:244:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:253:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:268:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:282:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:292:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:303:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:316:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:329:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:341:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:355:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:365:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:379:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:392:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:406:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:418:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:429:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:442:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:456:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:468:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:481:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:494:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:506:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:518:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:530:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:547:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:562:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:575:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:587:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:599:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:613:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:629:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:644:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:657:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:669:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:681:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:695:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:712:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:726:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:740:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:754:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:771:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:800:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:814:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:831:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:846:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:861:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:872:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:886:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:896:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./pkcs11f.h:911:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
In file included from ./rtpkcs11.h:56,
                 from ./Common.h:34,
                 from .\SertInfo.go:3:
./rtpkcs11f.h:15:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:27:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:38:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:49:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:63:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:82:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:103:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:123:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:144:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:166:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:177:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:193:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:214:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:224:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:233:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:243:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:252:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:266:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:279:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:289:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:301:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:311:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:321:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:333:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:343:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:360:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:376:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:389:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:401:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:411:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^
./rtpkcs11f.h:421:1: warning: 'dllimport' attribute ignored [-Wattributes]
 );
 ^

(2019-11-11 10:32:34 отредактировано MarErm)

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

Сам код на golang. Здесь просто идет вызов функции из CGO. Все остальные файлы на C# и библиотека лежат в той же папке, что и главный файл.

package main
/*
#include <Common.h>


//Шаблон для поиска сертификата                                          

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

int test()
{
    HMODULE module;                                    // Хэндл загруженной библиотеки PKCS#11
    CK_SESSION_HANDLE session;                         // Хэндл открытой сессии

    CK_FUNCTION_LIST_PTR functionList;                 // Указатель на список функций PKCS#11, хранящийся в структуре CK_FUNCTION_LIST
    CK_C_GetFunctionList getFunctionList;              // Указатель на функцию C_GetFunctionList

    CK_FUNCTION_LIST_EXTENDED_PTR functionListEx;      // Указатель на список функций расширения PKCS#11, хранящийся в структуре CK_FUNCTION_LIST_EXTENDED
    CK_C_EX_GetFunctionListExtended getFunctionListEx; // Указатель на функцию C_EX_GetFunctionListExtended

    CK_SLOT_ID_PTR slots;                              // Указатель на массив идентификаторов слотов
    CK_ULONG slotCount;                                // Количество идентификаторов слотов в массиве

    CK_OBJECT_HANDLE_PTR certificates;                 // Указатель на массив хэндлов объектов, соответствующих критериям поиска
    CK_ULONG objectCount;                              // Количество хэндлов объектов в массиве

    CK_BYTE_PTR info;                                  // Указатель на буфер, содержащий информацию о сертификате
    CK_ULONG size;                                     // Размер буфера, содержащего информацию о сертификате, в байтах

    CK_RV rv;                                          // Код возврата. Могут быть возвращены только ошибки, определенные в PKCS#11
    int r;                                             // Код возврата для функций, возвращающих int

    int errorCode = 1;                                 // Флаг ошибки


    //Выполнить действия для начала работы с библиотекой PKCS#11             

    printf("Initialization...\n");


    //Загрузить библиотеку                                                   

    module = LoadLibrary(PKCS11ECP_LIBRARY_NAME);
    CHECK(" LoadLibrary", module != NULL, exit);


    //Получить адрес функции запроса структуры с указателями на функции      

    getFunctionList = (CK_C_GetFunctionList)GetProcAddress(module, "C_GetFunctionList");
    CHECK(" GetProcAddress (C_GetFunctionList)", getFunctionList != NULL, unload_pkcs11);


    //Получить адрес функции запроса структуры с указателями на функции      
    //расширения стандарта PKCS#11                                           

    getFunctionListEx = (CK_C_EX_GetFunctionListExtended)GetProcAddress(module, "C_EX_GetFunctionListExtended");
    CHECK(" GetProcAddress (C_EX_GetFunctionListExtended)", getFunctionList != NULL, unload_pkcs11);


    //Получить структуру с указателями на функции                            

    rv = getFunctionList(&functionList);
    CHECK_AND_LOG(" Get function list", rv == CKR_OK, rvToStr(rv), unload_pkcs11);


    //Получить структуру с указателями на функции расширения стандарта       

    rv = getFunctionListEx(&functionListEx);
    CHECK_AND_LOG(" Get function list extended", rv == CKR_OK, rvToStr(rv), unload_pkcs11);


    //Инициализировать библиотеку                                            

    rv = functionList->C_Initialize(NULL_PTR);
    CHECK_AND_LOG(" C_Initialize", rv == CKR_OK, rvToStr(rv), unload_pkcs11);


    //Получить количество слотов c подключенными токенами                    

    rv = functionList->C_GetSlotList(CK_TRUE, NULL_PTR, &slotCount);
    CHECK_AND_LOG(" C_GetSlotList (number of slots)", rv == CKR_OK, rvToStr(rv), finalize_pkcs11);

    CHECK_AND_LOG(" Checking available tokens", slotCount > 0, " No tokens available", finalize_pkcs11);


    //Получить список слотов c подключенными токенами                        

    slots = (CK_SLOT_ID_PTR)malloc(slotCount * sizeof(CK_SLOT_ID));
    CHECK(" Memory allocation for slots", slots != NULL_PTR, finalize_pkcs11);

    rv = functionList->C_GetSlotList(CK_TRUE, slots, &slotCount);
    CHECK_AND_LOG(" C_GetSlotList", rv == CKR_OK, rvToStr(rv), free_slots);
    printf(" Slots available: %d\n", (int)slotCount);


    //Открыть RW сессию в первом доступном слоте                             

    rv = functionList->C_OpenSession(slots[0], CKF_SERIAL_SESSION | CKF_RW_SESSION, NULL_PTR, NULL_PTR, &session);
    CHECK_AND_LOG(" C_OpenSession", rv == CKR_OK, rvToStr(rv), free_slots);


    //Выполнить аутентификацию Пользователя                                  

    rv = functionList->C_Login(session, CKU_USER, USER_PIN, USER_PIN_LEN);
    CHECK_AND_LOG(" C_Login", rv == CKR_OK, rvToStr(rv), close_session);
    printf("Initialization has been completed successfully.\n");


    //Получение информации о сертификате                                     

    printf("\nGetting information...\n");

    
    //Получить массив хэндлов сертификатов                                   
    
    printf(" Getting certificates...\n");
    r = findObjects(functionList, session, certificateTemplate, arraysize(certificateTemplate),
                    &certificates, &objectCount);
    CHECK(" findObjects", r == 0, logout);

    CHECK_AND_LOG(" Checking number of certificates", objectCount != 0, "No objects found\n", logout);


    //Получение информации о сертификате                                     

    rv = functionListEx->C_EX_GetCertificateInfoText(session, certificates[0], &info, &size);
    CHECK_AND_LOG(" C_EX_GetCertificateInfoText", rv == CKR_OK, rvToStr(rv), logout);


    //Распечатать буфер, содержащий информацию о сертификате                 
    
    r = printUTF8String(info);
    CHECK(" Print info", r == 0, free_buffer);

    printf("Information has been acquired successfully.\n");

    
    //Выставить признак успешного завершения программы                       
    
    errorCode = 0;

    
    //Выполнить действия для завершения работы с библиотекой PKCS#11         

    printf("\nFinalizing... \n");


    //Освобождение буфера, содержащего информацию о сертификате                 

free_buffer:
    rv = functionListEx->C_EX_FreeBuffer(info);
    CHECK_RELEASE_AND_LOG(" C_EX_FreeBuffer", rv == CKR_OK, rvToStr(rv), errorCode);


    //Сбросить права доступа                                                 

logout:
    rv = functionList->C_Logout(session);
    CHECK_RELEASE_AND_LOG(" C_Logout", rv == CKR_OK, rvToStr(rv), errorCode);


    //Закрыть открытую сессию в слоте                                        

close_session:
    rv = functionList->C_CloseSession(session);
    CHECK_RELEASE_AND_LOG(" C_CloseSession", rv == CKR_OK, rvToStr(rv), errorCode);


    //Очистить память из-под слотов                                          

free_slots:
    free(slots);


    //Деинициализировать библиотеку                                          

finalize_pkcs11:
    rv = functionList->C_Finalize(NULL_PTR);
    CHECK_RELEASE_AND_LOG(" C_Finalize", rv == CKR_OK, rvToStr(rv), errorCode);

    
    //Выгрузить библиотеку из памяти                                         

unload_pkcs11:
    CHECK_RELEASE(" FreeLibrary", FreeLibrary(module), errorCode);

exit:
    if (errorCode) {
        printf("\n\nSome error occurred. Sample failed.\n");
    } else {
        printf("\n\nSample has been completed successfully.\n");
    }

    return errorCode;
}
*/
import "C"

import "fmt"
    
import "time"

func main() {
  fmt.Printf("Invoking c library...\n")
  C.test()
  time.Sleep(16 * time.Second)
 // fmt.Println("Done ", C.x(10) )
}

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

MarErm, скорее у вас на токене контейнер с сертификатом КриптоПро CSP.

Чтобы работать с контейнерами КриптоПро -- нужно использовать КриптоПро SDK и интерфейс CryptoAPI.

Если хотите работать с неизвлекамыми ключами и аппаратным криптопровайдером -- PKCS#11 из Рутокен SDK.
Неизвлекаемые ключи можно создать только на Рутокене ЭЦП 2.0, поскольку в Рутокен Лайт отсутствует криптоядро.

Для управления неизвлекаемыми ключами и сертификатами воспользуейтесь удобным веб-сервисом https://ra.rutoken.ru/

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

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

MarErm, скорее у вас на токене контейнер с сертификатом КриптоПро CSP.

Чтобы работать с контейнерами КриптоПро -- нужно использовать КриптоПро SDK и интерфейс CryptoAPI.

Если хотите работать с неизвлекамыми ключами и аппаратным криптопровайдером -- PKCS#11 из Рутокен SDK.
Неизвлекаемые ключи можно создать только на Рутокене ЭЦП 2.0, поскольку в Рутокен Лайт отсутствует криптоядро.

Для управления неизвлекаемыми ключами и сертификатами воспользуейтесь удобным веб-сервисом https://ra.rutoken.ru/

Можно уточнить, получается, что у меня не получится прочитать данные о сертификате на Рутокене ЭЦП 2.0 с помощью PKCS#11? Значит, для этой задачи нужно использовать другую библиотеку? Можете, пожалуйста, подсказать, какую?

Re: Как работать с информацией о сертификате, C_EX_GetCertificateInfoText?

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

MarErm, скорее у вас на токене контейнер с сертификатом КриптоПро CSP.

Чтобы работать с контейнерами КриптоПро -- нужно использовать КриптоПро SDK и интерфейс CryptoAPI.

Если хотите работать с неизвлекамыми ключами и аппаратным криптопровайдером -- PKCS#11 из Рутокен SDK.
Неизвлекаемые ключи можно создать только на Рутокене ЭЦП 2.0, поскольку в Рутокен Лайт отсутствует криптоядро.

Для управления неизвлекаемыми ключами и сертификатами воспользуейтесь удобным веб-сервисом https://ra.rutoken.ru/

У PKCS#11 заявлена поддержка Рутокен ЭЦП 2.0, получается и данные получить с помощью этой библиотеки можно?