Различия в чтении закрытого ключа с помощью libp11 и pkcs11-engine

Я пытаюсь реализовать аутентификацию клиента SSL в C ++ с использованием учетных данных, хранящихся на смарт-карте.

По сути, это означает использование библиотеки openssl для инициализации контекста SSL с использованием сертификата и закрытого ключа, а затем использование этого контекста для всех будущих соединений https.

Библиотеки, с которыми я столкнулся, чтобы помочь мне с этим, — libp11 и его модуль pkcs11-engine, найденный здесь: https://github.com/OpenSC/libp11 .

Сценарий, в котором мой код на самом деле работает так, как задумано для нашего веб-сервера, — это когда сертификат перечисляется и извлекается через libp11, а закрытый ключ извлекается по id с использованием механизма pkcs11:

PKCS11_enumerate_certs(slot->token, &certs, &ncerts);

X509 *cert = certs[0].x509;

EVP_PKEY *pkey = ENGINE_load_private_key(pkcs11_eng, "pkey_id", NULL, NULL);

if (!SSL_CTX_use_certificate(context->ctx, cert )) {
throw SSLError::getLastError();
}
if (!SSL_CTX_use_PrivateKey(context->ctx, pkey )) {
throw SSLError::getLastError();
}
if (!SSL_CTX_check_private_key(context->ctx)) {
throw SSLError::getLastError();
}

Тем не менее, для согласованности и для простоты, предпочтительно использовать libp11 для обоих этих поисков, так как это также исключит использование целого другого компонента (механизм pkcs11).

Проблема у меня заключается в том, что при получении pkey с помощью:

PKCS11_KEY *key = PKCS11_find_key(&certs[0]);
EVP_PKEY pkey = PKCS11_get_private_key(key)

И инициализируя ssl, проверки проходят, но следующая ошибка выдается SSL_connect() функция:

error:80009005:Vendor defined:PKCS11_rsa_encrypt:General Error

По сути, закрытый ключ работает, когда он извлекается с помощью движка, но при использовании libp11 выдается ошибка, что странно, потому что, просматривая код на github для движка, я заметил те же самые вызовы p11, которые я использовал.

Если кто-то имеет опыт работы с этой темой и может знать, что здесь происходит, это мне очень поможет.

2

Решение

Это было мое плохо. Я инициализировал движок pkcs11 с нашей собственной dll, реализующей pkcs11, но используя opensc dll при инициализации p11. Я думаю, что урок, полученный здесь, всегда внимательно смотреть перед копированием / вставкой кода

0

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

Других решений пока нет …

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