(2019-10-04 16:48:31 отредактировано Binger)

Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

Здравствуйте. Как я могу получить список идентификаторов (CKA_ID ключевых пар) всех сертификатов, имеющихся на токене? Посмотрел пример CertInfo из SDK, но там лишь получение информации о конкретном сертификате, ID которого был установлен в программе. А как мне сначала получить список всех сертификатов, чтобы потом я уже мог выбирать из них. И можно ли получить сразу же вместе с ID алгоритм работы сертификата? Буду рад любой помощи. Спасибо.

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

Binger пишет:

Здравствуйте. Как я могу получить список идентификаторов (CKA_ID ключевых пар) всех сертификатов, имеющихся на токене? Посмотрел пример CertInfo из SDK, но там лишь получение информации о конкретном сертификате, ID которого был установлен в программе. А как мне сначала получить список всех сертификатов, чтобы потом я уже мог выбирать из них. И можно ли получить сразу же вместе с ID алгоритм работы сертификата? Буду рад любой помощи. Спасибо.

Здравствуйте!

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

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

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

Здравствуйте!

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

В коде приложения

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

Хочу получить имена всех контейнеров, находящихся на токене, чтобы в дальнейшем действовать с определёнными из них

(2019-10-04 17:39:23 отредактировано Павел Анфимов)

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

1. Как найти все сертификаты

/*************************************************************************
* Шаблон для поиска сертификата                                          *
*************************************************************************/
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_CERTIFICATE_CATEGORY, &tokenUserCertificate, sizeof(tokenUserCertificate) }, // Категория сертификата - пользовательский
};


r = findObjects(functionList, session, certificateTemplate, arraysize(certificateTemplate),
                    &certificates, &objectCount);

2. А затем для найденных объектов в цикле получайте CKA_ID.
Упрощенный код:

for(CK_ULONG i = 0; i < objCount; ++i) {
      CK_ATTRIBUTE idAttr = { CKA_ID, NULL_PTR, 0 };
      rv = C_GetAttributeValue(session, pObjHandles[i], &idAttr, 1);
      if(rv != CKR_OK) break;

      std::vector<CK_BYTE> ckId;
      ckId.resize(idAttr.ulValueLen);
      idAttr.pValue = ckId.data();
 
      rv = functionList->C_GetAttributeValue(session, pObjHandles[i], &idAttr, 1);
      if(rv != CKR_OK) break;
}

3. У закрытого ключа, открытого ключа и сертификата одинаковые CKA_ID.
Чтобы найти закртый ключ по CKA_ID сертификата, надо поиска объектов c CKA_CLASS == CKO_CERTIFICATE и получения их CKA_ID, запустить второй поиск, где в качестве шаблона поиска будет CKA_ID ключа и CKA_CLASS == CKO_PRIVATE_KEY.

4. Алгорим сертификата можно найти в информации, которая выдает функция C_EX_GetCertificateInfoText

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

Павел Анфимов, у меня тут проблема вылезла...
https://forum.rutoken.ru/uploads/images/2019/10/f9528863c9aa081479f335ef73377423.png

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

Binger пишет:

Павел Анфимов, у меня тут проблема вылезла...
https://forum.rutoken.ru/uploads/images/2019/10/f9528863c9aa081479f335ef73377423.png

Опечатка вкралась. Все функции PKCS#11 нужно вызывать через указатель на functionList:

 functionList->C_GetAttributeValue(session, pObjHandles[i], &idAttr, 1);

Re: Как получить идентификатор сертификата (CKA_ID ключ. пары) на токене?

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