using (Session session = slot.OpenSession(SessionType.ReadWrite))
{
session.Login(CKU.CKU_SO, "pin");
List<ObjectAttribute> publicKeyAttributes = new List<ObjectAttribute>();
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_RSA));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_PRIVATE_KEY));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "label2"));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "label1"));
publicKeyAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "Pkcs11Interop"));
List<ObjectHandle> foundPublicKeys = session.FindAllObjects(publicKeyAttributes);
}
我正在尝试使用 Pkcs11Interop 库从HSM获取我自己的证书并从账单中获取。
当我尝试使用此代码查找自己的证书时:
var foundObjects = session.FindAllObjects (searchTemplate)
它返回零(0)。
session.GenerateKeyPair (mechanism, publicKeyAttributes, privateKeyAttributes, out publicKeyHandle, out privateKeyHandle);
我找到了这段代码,但收到了错误。
C_GenerateKeyPair returned CKR_USER_NOT_LOGGED_IN
任何人都可以帮助我吗?感谢。
答案 0 :(得分:4)
所以,让我们回答一下我猜你试图提出的问题:
问题#1:当我尝试使用
var foundObjects = session.FindAllObjects(searchTemplate);
找到我自己的证书对象时,我得到零对象。为什么呢?
你没有发布你的搜索模板,所以我只能猜测。我的猜测是你的搜索模板与你期望找到的对象的属性不匹配。换句话说,令牌上没有符合搜索模板条件的对象。
有关详细信息,请参阅PKCS#11 v2.20 specification中C_FindObjectsInit
函数的文档。它声明:
匹配条件是与模板中所有属性完全逐字节匹配。
您还可以阅读PKCS#11 v2.20 specification的第10章,以熟悉PKCS#11对象类型及其属性。
问题#2 :当我尝试使用
session.GenerateKeyPair()
方法生成新密钥对时,我收到错误C_GenerateKeyPair returned CKR_USER_NOT_LOGGED_IN
。为什么呢?
PKCS#11 v2.20 specification州的第6.5章:
只允许普通用户访问令牌上的私有对象,并且只有在正常用户通过身份验证后才能授予该访问权限。有些令牌可能还要求在对令牌执行任何加密功能之前对用户进行身份验证,无论是否涉及私有对象。
所以我猜你必须首先通过调用session.Login()
方法对你的令牌进行身份验证,之后你应该能够创建新的令牌对象(生成密钥)。
请注意强烈推荐,在开始使用Pkcs11Interop之前,您至少应熟悉&#34;第2章 - 范围&#34; ,&#34;第6章 - 概述&#34; 和&#34;第10章 - PKCS#11 v2.20 specificiation的对象&#34; (或任何以前的等同章节或后续规范版本。)