问题标签 [opensc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如果智能卡被移除并再次插入,OpenSC 的 java pkcs11 插槽检测问题
背景信息这可能有助于 alaysis :
我正在尝试从 Web 应用程序连接到智能卡并从运行在客户端计算机上的 java 程序读取证书以执行一些签名操作。我正在使用 Opensc-PKCS11.dll 和 java sunpkcs11 提供程序类来访问智能卡上的证书(FIPS PIV 合规智能卡)。
我的问题是只要连接了智能卡,我就可以访问智能卡上的密钥库并执行加密操作,但是当我们移除智能卡并再次插入时,程序无法获取插槽 ID,因为加载提供程序失败。
由于我无法硬编码我的插槽 ID,因此我将其保留为 0/-1
尽管相关,但这个问题确实提供了足够的信息。 Java - 如何检测智能卡热插拔
更新:我可以解决这个问题。在 finally 块中,我在提供者的工作完成后从提供者调用了 C_Finalize。对于在同一个 java 实例中的下一次运行,我做了一些类似下面清除 PKCS11 映射并再次初始化提供程序的事情
openssl - 从智能卡上的密钥对创建自签名证书
我使用来自 OpenSC 的 pkcs11-tool 和自定义 PKCS#11 库在智能卡上生成了一个密钥对。这个 PKCS#11 库是我的测试对象。
现在我想用这个密钥对创建一个证书。到目前为止,当我有 PEM 格式(文件)的密钥对时,我找到了创建证书的方法,但我想在卡上使用密钥对。
我正在使用 Windows 7。
pkcs#11 - 带有 pkcs11interop 的热门使用机制 CKM_ECDH1_DERIVE
我买了一个 NitroKey HSM,想用 EC 导出一个秘密。 以前的问题
为此,我想使用这些CKM_ECDH1_DERIVE
机制。此 HSM 支持,请参阅:
参考PKCS#11 规范,这必须考虑:
- 机构
CKM_ECDH1_DERIVE
必须与功能一起使用Derive
(页 188) - 该机制
CKM_ECDH1_DERIVE
需要CK_ECDH1_DERIVE_PARAMS
具有以下参数的参数(第 222 页):- kdf : 用于共享秘密值 (CKD) 的密钥派生函数
- sharedData : 双方共享的一些数据
- publicData : 对方EC公钥值
- 该函数
DeriveKey
需要这些参数:- 机制 CKM.CKM_ECDH1_DERIVE
- 对象句柄私钥
- 对象属性(第 338 页)
- CKA.CKA_CLASS -> CKO.CKO_SECRET_KEY
- CKA.CKA_KEY_TYPE -> CKK.CKK_GENERIC_SECRET
- 但是“但是,由于这些事实都隐含在机制中,因此无需指定其中任何一个”,因此这些可以为空吗?
问题
所以有了这些信息,我尝试实现一个方法。
但我得到这个错误:
Net.Pkcs11Interop.Common.Pkcs11Exception:方法 C_DeriveKey 返回 CKR_TEMPLATE_INCOMPLETE
在Session.DeriveKey
.
CKR_TEMPLATE_INCOMPLETE
(第 64 页)的解释:
如果提供的模板中的属性值以及任何默认属性值和由对象创建函数本身贡献给对象的任何属性值都不足以完全指定要创建的对象,则尝试应该失败并返回错误代码CKR_TEMPLATE_INCOMPLETE。
在这里(第 98 页)
CKR_TEMPLATE_INCOMPLETE:为创建对象指定的模板不完整,缺少一些必要的属性。有关详细信息,请参阅第 10.1 节。
但我使用了必要的属性:
- CKA.CKA_CLASS -> CKO.CKO_SECRET_KEY
- CKA.CKA_KEY_TYPE -> CKK.CKK_GENERIC_SECRET
想法?
代码
另请参阅要点(相同代码)https://gist.github.com/dhcgn/4ea235cdb20155ec5ea9dc9bbf3c9887
更新
现在使用更新的 ObjectAttributes 列表(感谢答案)我得到了异常Net.Pkcs11Interop.Common.Pkcs11Exception : Method C_DeriveKey returned CKR_DATA_LEN_RANGE
。
CKR_DATA_LEN_RANGE:加密操作的明文输入数据长度错误。根据操作的机制,这可能意味着明文数据太短、太长,或者不是某些特定块大小的倍数。此返回值的优先级高于 CKR_DATA_INVALID。
因为CKA.CKA_VALUE_LEN
我尝试了不同的值但没有成功:
我偶然发现了公钥,我不确定我是否以正确的方式提取公钥。因为它的长度为664 Bit
。
CKA.CKA_VALUE
( CKO.CKO_PUBLIC_KEY
) 664 Bit
:
pkcs15-tool
用( 864 Bit
)提取
pkcs15-tool
为什么和之间的公钥不同CKO.CKO_PUBLIC_KEY
?CkEcdh1DeriveParams
期望哪种格式publicData
?- 我是否
publicData
以正确的方式提取?或者什么是正确的方法? - 的值必须
CKA.CKA_VALUE_LEN
等于我的 EC (320 Bit
) 的长度吗?
pkcs#11 - 异常“CKR_FUNCTION_NOT_SUPPORTED”,PKCS11Interop 与 OpenSC
我正在尝试将 PKCS11Interop 库与最新版本(0.16)的 OpenSC(opensc-pkcs11.dll)一起使用。我尝试过来自 Yubico 4、NitroKey Pro/Start、Fetian ePass2003 三个供应商的 USB 令牌,但无法使用 PKCS11Interop 库中的大部分功能。对于库提供的大多数函数,我收到Net.Pkcs11Interop.Common.Pkcs11Exception: 'Method C_SignRecoverInit returned CKR_FUNCTION_NOT_SUPPORTED'。抛出此异常的函数是 C_GetOperationState、C_SetOperationState、C_GenerateKey、C_GenerateKeyPair、加密/解密函数、签名/验证函数等。
奇怪的是,GetSlotInfo、GetMechanisms、Login、Session 等功能运行良好。
我花了很多时间试图在这里找到解决方案。如果有人可以提供帮助,将不胜感激。
public-key-encryption - 如何将“byte[] publicKey”转换为“Data Object”(使用 ObjectHandle)
我正在从发件人的证书中提取用于加密的公钥作为字节 [] 数组
我希望使用 PKCS11Interop Encrypt() 函数,该函数采用密钥的 ObjectHandle 来加密消息/数据。我发现的唯一方法是设置 ObjectAttributes 和 session.CreateObject(objectAttributes); 并最终销毁对象。
但是我得到 CKR_FUNCTION_NOT_SUPPORTED 调用 CreateObject()。正如 jariq 在这篇文章中所澄清的那样,OpenSC PKCS#11 库不支持/实现 PKCS#11 规范中定义的某些功能,使用字节数组 publicKey 进行加密的替代方法/解决方法是什么?
linux - SC/OPENSC 如何读写
我正在整理如何实现以下,我想在项目中使用智能卡或存储卡。卡片应由标准化读卡器(例如 ACR38)读取。当它们被计算机(命令行或软件(处理或p5js或类似)读取时,应该会弹出一个窗口,显示卡片的内容是图片和文字。当我使用我的常规时有点相似我的 E-idsoftware 要读取的 ID。
目前我的卡是这张SLE4428(在供应商的底部说明中)这些还没有数据,买的是空白的
=>数据表
我找到但不知道它是否适合我的项目以及如何具体使用它的软件如下。
我在搜索 SC 卡软件时发现的开源工具(不知道如何使用它们。)
https://linux.die.net/man/1/opensc-tool
https://linux.die.net/man/1/opensc-explorer
我查看了我的智能卡读卡器,发现http://www.acr38u.com/ 是一个平台,但必须付费,我无法在 linux 或苹果上找到此软件。再次在这里,我找到了一个带有十六进制代码的数据表来连接到卡,但仍然不知道如何物理连接到卡。
该站点显示了工作外壳的许多要点,但我找不到它的安装程序。开放式
最后,这是最有前途的,我已经联系了它的制造商。但是安装卡在制作过程中(我已经搜索过并且还没有解决方案,现在已经使用了一个星期,所以这篇文章,也许社区可以提供另一种外观)
这是来自供应商方面(Aliexpress)的解释,这是一种具体的解释。虽然我不知道在哪里输入这些十六进制代码以从卡上写入或读取。(有一个软件,但它是windows(如果有人可以说,这是解决我项目核心问题的方法,那么我会尝试让一台windows pc通过这种方式工作))
这个问题的细节在于
A:如何在linux或mac上实现工作环境(第一个)在sc卡上读写数据(我有的那个或!B:一个工作的替代品)C:创建一个查看器程序或webapp等。在读取 SC 卡时查看或路由数据。(这将是一个有效的问题,如果我在哪里选择基于 Windows 的现有程序,我想)
php - 使用 PKCS#11 的 PHP 中的 PKCS#7 签名,无需 CLI 调用
有没有一种方法可以使用纯 PHP 使用符合 PKCS#11 的 HSM 设备(读卡器)创建 PKCS#7 (S/MIME) 签名,即无需显式 shell 命令调用,例如使用PHP OpenSSL库或其他胶水?
openssl
我可以使用带有 PKCS#11 引擎的CLI 成功创建 PKCS#7 签名,如下所示:
我想清理它,但使用纯 PHP 似乎是不可能的,因为据我所知,openssl_pkcs7_sign()函数只能与私钥文件一起使用,而不支持pkcs11-engine
提供的密钥。我错过了什么吗?
dlopen - dlopen() 加载 opensc-pkcs11.so 失败
在尝试从应用程序中 dlopen /usr/lib/x86_64-gnu-linux/opensc-pkcs11.so 时,我得到库的“无法打开共享对象文件:没有这样的文件或目录”。
我按照维基上的说明 https://github.com/OpenSC/OpenSC/wiki/Compiling-and-Installing-on-Unix-flavors
并且还做了一个 sudo apt-get install opensc-pkcs11.so。该文件存在于 /usr/lib/x86_64-gnu-linux 中,这是库搜索路径。
还有什么需要做的吗?是否需要设置任何环境变量?SoftHSM 库的 dlopen 也是如此。
想指出的是,在运行 pkcs11-tool 命令行时,它可以工作
因此,当我在我的应用程序中尝试相同的 dlopen 时,它似乎失败了。有任何想法吗 ?
pkcs#11 - pkcs#11 CKR_DEVICE_REMOVED 错误登录到 HSM
我已将 SmartCard HSM usb 插入我的笔记本电脑。当我使用 PKCS#11 API 通过应用程序运行命令时,我可以看到它:
它已使用 SO-PIN 和 USER-PIN 进行初始化。
当我尝试使用 登录 HSMC_Login
时,我收到CKR_DEVICE_REMOVED
错误消息。USB HSM 仍然插入。我用谷歌搜索了错误,但没有任何结果。
如何登录 HSM?