我試圖使用存儲在智能卡上的憑證在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調用使我正在使用。
如果任何人有任何關於此主題的經驗,並且可能知道這裏發生了什麼,這將對我有很大的幫助。