-1
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 

谁能帮我?谢谢。

4

1 回答 1

4

所以让我们回答我猜你想问的问题:

问题 #1:当我尝试找到自己的证书对象时,var foundObjects = session.FindAllObjects(searchTemplate);我得到零个对象。为什么?

您没有发布您的搜索模板,所以我只能猜测。我的猜测是您的搜索模板与您期望找到的对象的属性不匹配。换句话说,您的令牌上没有与搜索模板条件匹配的对象。

有关更多详细信息,请参阅PKCS#11 v2.20 规范C_FindObjectsInit中的函数文档。它指出:

匹配标准是与​​模板中所有属性的逐字节精确匹配。

您还可以阅读PKCS#11 v2.20 规范的第 10 章来熟悉 PKCS#11 对象类型及其属性。

问题 #2:当我尝试使用session.GenerateKeyPair()方法生成新的密钥对时出现错误C_GenerateKeyPair returned CKR_USER_NOT_LOGGED_IN。为什么?

PKCS#11 v2.20 规范的第 6.5 章规定:

只有普通用户可以访问令牌上的私有对象,并且只有在普通用户通过身份验证后才授予访问权限。一些令牌还可能要求在对令牌执行任何加密功能之前对用户进行身份验证,无论它是否涉及私有对象。

所以我想你必须首先通过调用session.Login()方法对你的令牌进行身份验证,然后你应该能够创建新的令牌对象(生成密钥)。


请注意,强烈建议您在开始使用Pkcs11Interop之前至少熟悉PKCS# 11 v2.20规范(或任何先前或后续规范版本的等效章节)。

于 2018-03-31T09:19:34.033 回答