2016-10-17 104 views
2

我試圖使用存儲在智能卡上的憑證在C++中實現SSL客戶端身份驗證。使用libp11和pkcs11引擎讀取私鑰的差異

本質上,這意味着使用openssl庫使用證書和私鑰初始化SSL上下文,然後將此上下文用於所有未來的https連接。

我遇到過的庫是libp11和它的pkcs11引擎模塊,在這裏找到:https://github.com/OpenSC/libp11

在我的代碼實際工作爲方案意在與我們的Web服務器是在證書中列出,並取回通過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-engine)。

我遇到的問題是,與檢索p鍵時:

error:80009005:Vendor defined:PKCS11_rsa_encrypt:General Error

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

和初始化SSL,檢查通過,但下面的錯誤是由SSL_connect()函數拋出

基本上,私鑰在通過引擎檢索時有效,但使用libp11時會引發錯誤,這很奇怪,因爲通過github上的代碼查看引擎,我注意到相同的p11調用使我正在使用。

如果任何人有任何關於此主題的經驗,並且可能知道這裏發生了什麼,這將對我有很大的幫助。

回答

0

這是我的不好。我正在用我們自己的dll實現pkcs11來初始化pkcs11引擎,但在初始化p11時使用了opensc dll。我猜這裏學到的教訓總是在複製/粘貼代碼之前仔細查看