key - 在 PKCS #11 中查找私钥对象
问题描述
我使用针对 SoftHSM 的 PKCS 11 API 具有以下工作序列:
- 生成多个 RSA 密钥。
- 将密钥对保存在密钥库中。
- 稍后,从密钥库中检索给定模数大小的 RSA 密钥对。唯一的要求是其模数的大小必须是指定的。
- 使用检索到的密钥对中的私钥进行签名操作。
我可以毫无问题地完成前两个步骤。对于第 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。
如果如上无法获取到私钥对象句柄,怎么办?我需要这样的对象句柄来计算签名。
解决方案
推荐阅读
- google-apps-script - 设置富文本值不适用于具有不同格式的值
- python-3.x - ModuleNotFoundError: No module named 'encodings' - 当 virtualenv 路径与项目主目录不同时出现 uwsgi 错误
- google-drive-api - 当我使用共享驱动器 webhook 中的 fileId 时,尽管端点返回状态 200,但不会出现
- perl - 代码不会从变量中删除非 ascii 字符
- android - 使用Android的Google Sheets,如何将一整列URL激活成超链接
- email - 使用 ASP.net 发送邮件会导致 AuthenticationException
- python - pandas.core.base.SpecificationError - 重新采样
- html - CSS有没有办法只在背景上应用边框半径
- docker - 来自守护程序的错误响应:获取 https://docker.intra/v2/main/manifests/3.64.0:未知:凭据错误
- java - 在 computeIfPresent 之后如何使用 forEach