【问题标题】:C_GenerateKeyPair returned CKR_USER_NOT_LOGGED_INC_GenerateKeyPair 返回 CKR_USER_NOT_LOGGED_IN
【发布时间】:2018-03-31 06:32:03
【问题描述】:
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 

谁能帮帮我?谢谢。

【问题讨论】:

标签: c# .net rsa hsm pkcs11interop


【解决方案1】:

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

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

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

更多细节参见PKCS#11 v2.20 specificationC_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 之前,您至少要熟悉“第 2 章 - 范围”“第 6 章 - PKCS#11 v2.20 specificiation 的“一般概述”“第 10 章 - 对象”(或任何先前或后续规范版本的等效章节)。

【讨论】:

  • 所以我这里的问题是,我是否尝试使用用户“CKU.CKU_SO”输入我的 session.login()?
  • @TEngineer CKU_SO 无权访问私有对象 - CKU_USER 有。每个对象都由一组属性组成,每个属性都只有一个值 - 您不能在单个模板中多次指定 CKA_CLASS。看来您根本没有阅读规范。
  • 您的元建议非常好,但它不属于答案,因为答案不仅适用于问题作者。我会把它复制到 cmets。
  • 你说得对,小心点。我申请了@jariq。但是我仍然找不到我的证书。这次我在“PublicKeyAttributes”部分添加了-CKA_CLASS,CKA_LABEL-,但我仍然无法得到我想要的结果,并且正确应用了session.Login(CKU.CKU_USER,密码)这部分。我应该把它称为一个单独的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2018-09-15
相关资源
最近更新 更多