PKCS#11调用C_FindObjects按模数位查找RSA私钥无结果问题咨询
问题根因
- 首先存在低级变量名错误:
你代码中定义的存储密钥类别的变量名为CK_OBJECT_CLASS type = CKO_PRIVATE_KEY,但CK_ATTRIBUTE数组里传的是&class,这个未定义的变量class的值是随机的,自然匹配不到私钥对象。 - 第二个核心逻辑问题:
按照PKCS#11 v2.40规范定义,CKA_MODULUS_BITS是RSA公钥的可选属性,私钥对象默认不存储该属性,所以你在私钥的搜索模板里加上CKA_MODULUS_BITS过滤条件,必然匹配不到任何结果。而公钥对象包含该属性,所以搜索公钥可以正常返回结果。
正确实现方案
推荐用公私钥关联的方式检索对应私钥,兼容性最好,符合PKCS#11规范要求:
- 先修正变量名错误,按你现有逻辑搜索符合模数要求的RSA公钥,拿到公钥对象句柄
- 调用
C_GetAttributeValue读取该公钥的CKA_ID属性值,同一密钥对的公私钥会共用相同的CKA_ID - 构造私钥搜索模板,用
CKA_CLASS=CKO_PRIVATE_KEY、CKA_KEY_TYPE=CKK_RSA、CKA_ID=你读取到的公钥ID作为过滤条件,即可检索到对应的私钥句柄 - 拿到私钥句柄后即可正常调用
C_SignInit、C_Sign接口执行签名操作
如果要简化流程,也可以在生成RSA密钥对时,手动给私钥对象也设置CKA_MODULUS_BITS属性,后续就可以直接按你原有逻辑搜索私钥,但该方式依赖你对密钥生成流程的控制,跨HSM设备的兼容性不如上述关联检索方案。
可选验证步骤
如果要确认私钥属性,可以先构造无额外过滤条件的私钥搜索模板,枚举所有私钥,打印每个私钥的所有属性值,确认是否存在CKA_MODULUS_BITS属性,快速定位问题。
内容的提问来源于stack exchange,提问作者Jay Smith
相关产品推荐
相关产品推荐

