2016-10-17 4 views
2

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

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

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

сценарий, в котором мой код на самом деле работает как задумано с нашего веб-сервера, где сертификат в списке и получить через libp11 и секретный ключ извлекается идентификатор с помощью 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-engine).

Проблема у меня в том, что при получении 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 что я использовал.

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

ответ

0

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