使用libp11和pkcs11-engine读取私钥的差异

时间:2016-10-17 09:53:40

标签: c++ openssl cryptography pkcs#11 opensc

我正在尝试使用存储在智能卡上的凭据在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-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调用相同。

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

1 个答案:

答案 0 :(得分:0)

这是我的坏事。我用我们自己的dll初始化pkcs11引擎实现了pkcs11,但在初始化p11时使用了opensc dll。我想这里学到的经验总是在复制/粘贴代码之前仔细查看