使用 libp11 和 pkcs11-engine 读取私钥的区别

Differences in reading private key with libp11 and pkcs11-engine

我正在尝试使用存储在智能卡上的凭据在 C++ 中实现 SSL 客户端身份验证。

本质上,这意味着使用 openssl 库使用证书和私钥初始化 SSL 上下文,然后将此上下文用于所有未来的 https 连接。

我遇到的帮助我解决这个问题的库是 libp11 及其 pkcs11-engine 模块,可在此处找到:https://github.com/OpenSC/libp11 .

我的代码实际上与我们的网络服务器一起按预期工作的场景是通过 libp11 列出和检索证书,并使用 pkcs11 引擎通过 id 检索私钥:

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 调用我正在使用。

如果有人对此主题有任何经验并且可能知道这里发生了什么,那将对我有很大帮助。

这是我的错。我使用我们自己的实现 pkcs11 的 dll 初始化 pkcs11 引擎,但在初始化 p11 时使用 opensc dll。我想这里吸取的教训是在copy/pasting代码

之前总是仔细看