在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 .
我的代码实际上与我们的web服务器按预期工作的场景是,证书通过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调用,我正在使用。
如果有人对这个话题有任何经验,可能知道这里是怎么回事,这会对我有很大的帮助。
我错了。我用我们自己的实现pkcs11的dll初始化pkcs11引擎,但在初始化p11时使用opensc dll。我想这里学到的教训是在复制/粘贴代码之前一定要仔细查看
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何在C++中使用X509证书模在令牌中查找私钥
- 私钥解密代码使用公共接口说明符到 BSAFE 库 v6.0?
- 从字符串 Crypto++ 导入 RSA 公钥/私钥
- 将私钥和证书存储在C++/OpenSSL中
- 区块链超级账本私钥错误
- 博坦加载现有的 RSA 私钥
- C 从XML导入CAPI/CNG中的RSA私钥
- 使用密码将 RSA 私钥写入 PEM 文件
- 一代 RSA-2048 密钥(公钥和私钥)
- 如何获取PCCERT_CONTEXT私钥的NCRYPT_KEY_HANDLE?
- 将ECDSA Keypair的公共和私钥分开
- RSA 私钥加密 QT C++
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 openssl libcrypto 解密具有 RSA 私钥的数据时RSA_NO_PADDING的使用
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- 如何使用openssl-lib-pem_read从字符串中读取公钥/私钥
- 在libp11和pkcs11-engine中读取私钥的差异
- OpenSSL私钥读取错误(PEM_read_bio_RSAPPrivateKey)
- 如何读取RSA公钥和私钥到单个RSA结构