Как прочитать информацию о сертификате X.509, хранящемся на USB-токене?

Я использую USB-токен SafeNet iKey для своего приложения.

Мое приложение на C ++ (приложение win32), и я получаю доступ к функциональности токена через интерфейс PKCS (pkcs11.h) из его SDK.

До сих пор мне удавалось успешно делать следующее: генерировать пару открытых / закрытых ключей, шифровать / дешифровать, подписывать / проверять, считывать атрибуты объектов, хранящихся внутри токена.

Но главная проблема заключается в следующем: после импорта сертификата X.509 в токен (с помощью iKey Token Utility) я не могу прочитать сведения о сертификате в своем приложении C ++, так как они нужны мне, чтобы знать, какой пользователь использует мое приложение, т.е. личность пользователя , Однако с помощью «iKey Token Utility», поставляемой с драйвером токена, можно просмотреть сведения о сертификате. Я нигде не мог найти исходный код этой утилиты, также библиотека pkcs11.h не имеет функций, связанных с чтением информации о сертификате. Для меня было бы просто полезно прочитать значение открытого ключа (а не его дескриптора) сертификата.

Я попытался прочитать атрибуты объекта сертификата внутри токена, используя PKCS, но, похоже, он дает мне значения, закодированные в каком-то формате.

Я тщательно просмотрел документацию по SDK и по Интернету, но не смог найти ответ на свой вопрос:

  • Как прочитать сведения о сертификате X509 с токена безопасности USB, используя PKCS в C ++?

Буду признателен за любые подсказки, чтобы решить эту проблему, спасибо …

2

Решение

Согласно PKCS # 11, сертификаты X509 являются неким типом хранимых объектов, которые их класс данных (CKA_CLASS атрибут) равно CKO_CERTIFICATE,
Если вы хотите получить объект сертификата из вашего токена, все, что вам нужно, это использовать C_GetAttributeValue функция.
Перед этим вы можете найти все сертификаты x.509, хранящиеся на вашем токене:

CK_BBOOL _true = CK_TRUE;
CK_OBJECT_CLASS certClass = CKO_CERTIFICATE;
CK_CERTIFICATE_TYPE certType = CKC_X_509_ATTR_CERT;
CK_ATTRIBUTE certificateSearchTemplate[] = {
{CKA_CLASS, &certClass, sizeof(dataClass)},
{CKA_CERTIFICATE_TYPE, &certType, sizeof(certType)},
{CKA_TOKEN, &_true, sizeof(_true)}
};

CK_OBJECT_HANDLE hObject;
CK_ULONG ulObjectCount;
CK_RV rv = C_FindObjectsInit(hSession, certificateSearchTemplate, 3);
assert(rv == CKR_OK);
while (1) {
rv = C_FindObjects(hSession, &hObject, 1, &ulObjectCount);
if (rv != CKR_OK || ulObjectCount == 0)
break;
//hObject is handle of a x.509 certificate, so you can fetch your desired attributes from it using C_GetAttributeValue
getCertificateAttributes(hObject);
}
rv = C_FindObjectsFinal(hSession);
assert(rv == CKR_OK);

И в getCertificateAttributes Функция позволяет получить нужные атрибуты сертификата:

void getCertificateAttributes(CK_OBJECT_HANDLE hCert)
{
CK_ATTRIBUTE pTemplate[] = {
//List your desired attributes here
};
...
CK_RV rv = C_GetAttributeValue(hSession, hCert, &pTemplate, pTemplateLen);
if (rv == CKR_OK) {
//here you have your desired certificate attributes
}
}
2

Другие решения

Помимо библиотеки PKCS # 11, Microsoft CryptoAPI(mscapi.dll) также можно использовать для получения сведений о сертификате. Тем не мение, MSCAPI также использует PKCS внутренне взаимодействовать с токеном usb. Таким образом, должен быть какой-то способ решить проблему, используя библиотеку PKCS без MSCAPI.

0

По вопросам рекламы [email protected]