首页 > 解决方案 > 在 PKCS #11 中查找私钥对象

问题描述

我使用针对 SoftHSM 的 PKCS 11 API 具有以下工作序列:

  1. 生成多个 RSA 密钥。
  2. 将密钥对保存在密钥库中。
  3. 稍后,从密钥库中检索给定模数大小的 RSA 密钥对。唯一的要求是其模数的大小必须是指定的。
  4. 使用检索到的密钥对中的私钥进行签名操作。

我可以毫无问题地完成前两个步骤。对于第 3 步,我尝试使用以下代码:

  CK_KEY_TYPE key_type = CKK_RSA;
  CK_OBJECT_HANDLE rsa_key;
  CK_OBJECT_CLASS type = CKO_PRIVATE_KEY;
  CK_BBOOL true = TRUE;

  CK_ATTRIBUTE keyAttrs[] = {
    { CKA_TOKEN, &true, sizeof(true) },
    { CKA_KEY_TYPE, &key_type, sizeof(key_type) },
    { CKA_CLASS, &class, sizeof(class) },
    { CKA_MODULUS_BITS, &modulus_size, sizeof(modulus_size) }
  };

  CK_ULONG template_size, returned;
  CK_RV rv;

  template_size = sizeof(keyAttrs) / sizeof(CK_ATTRIBUTE);

  rv = f->C_FindObjectsInit(hSession, keyAttrs, template_size);
  if (rv != CKR_OK) {
      printf("C_FindObjectsInit: %d\n", rv);
      break;
  }

  rv = f->C_FindObjects(hSession, key, 1, &returned);
  if (rv != CKR_OK) {
    printf("C_FindObjects: %d\n", rv);
    return rv;
  }

  rv = f->C_FindObjectsFinal(hSession);
  if (rv != CKR_OK) {
    printf("C_FindObjectsFinal: %d\n", rv);
    return rv;
  }

  return rv;

这不起作用。上面所有的 C_Find* 调用都返回 CKR_OK,但是 C_FindObjects 找不到任何与 keyAttrs 数组中的属性匹配的私钥:当该函数返回时,返回的值设置为 0。但是,当我将 CK_OBJECT_CLASS 类型设置为等于 CKO_PUBLIC_KEY 时,我获得了一个公钥对象句柄。

我显然在这里遗漏了一些重要的东西,但是,什么?运行此代码的 PKCS 11 会话是使用 CKF_RW_SESSION | 打开的。CKF_SERIAL_SESSION 标志,此时的会话状态为 CKS_RW_USER_FUNCTIONS。

如果如上无法获取到私钥对象句柄,怎么办?我需要这样的对象句柄来计算签名。

标签: keyprivatepkcs#11

解决方案


推荐阅读