使用NodeJS与PKCS11js库在USB Token上生成/复制密钥对属性配置问题
PKCS11js公钥导入属性配置说明
你在Java中使用的这些PKCS#11标准属性,在PKCS11js中完全可以复用,只需要调整属性的传值格式和命名规则即可,属性本身的业务含义和校验规则和Java侧完全一致。
核心差异说明
PKCS11js完全遵循PKCS#11 v2.40标准,你列出的10个属性都是标准定义的RSA公钥必填属性,仅在传参方式上和Java侧有区别:
- Java侧直接使用
CKA_开头的常量作为属性标识,PKCS11js中需要调用库内置的CKA_*常量作为type字段的值 - 二进制类型的属性值(比如模数、公钥指数、主体、ID)在PKCS11js中必须传入
Buffer类型,不能直接传字符串或者数字数组 - 布尔类型的属性值(比如
CKA_TOKEN、CKA_VERIFY)直接传布尔值即可
属性对应示例
你列出的属性在PKCS11js中的对应配置参考如下:
CKA_TOKEN→{ type: pkcs11.CKA_TOKEN, value: true },true表示公钥持久化存储到Token中CKA_CLASS→{ type: pkcs11.CKA_CLASS, value: pkcs11.CKO_PUBLIC_KEY },标识该对象为公钥CKA_KEY_TYPE→{ type: pkcs11.CKA_KEY_TYPE, value: pkcs11.CKK_RSA },标识密钥类型为RSACKA_MODULUS_BITS→{ type: pkcs11.CKA_MODULUS_BITS, value: 2048 },按实际密钥长度填数值即可CKA_VERIFY→{ type: pkcs11.CKA_VERIFY, value: true },标识该公钥可用于签名验证CKA_MODULUS→{ type: pkcs11.CKA_MODULUS, value: Buffer.from(你的模数二进制数据) }CKA_PUBLIC_EXPONENT→{ type: pkcs11.CKA_PUBLIC_EXPONENT, value: Buffer.from([0x01, 0x00, 0x01]) }CKA_SUBJECT→{ type: pkcs11.CKA_SUBJECT, value: Buffer.from(主题的DER编码数据) }CKA_ID→{ type: pkcs11.CKA_ID, value: Buffer.from(自定义ID) }CKA_LABEL→{ type: pkcs11.CKA_LABEL, value: "自定义公钥名称" }
代码示例
const pkcs11 = require('pkcs11js'); const pkcs11Instance = new pkcs11.PKCS11(); // 前置操作:加载厂商PKCS11库、打开设备、打开会话、登录用户省略 const session = 0; // 替换为你自己的会话句柄 const publicKeyAttrs = [ { type: pkcs11.CKA_CLASS, value: pkcs11.CKO_PUBLIC_KEY }, { type: pkcs11.CKA_KEY_TYPE, value: pkcs11.CKK_RSA }, { type: pkcs11.CKA_TOKEN, value: true }, { type: pkcs11.CKA_VERIFY, value: true }, { type: pkcs11.CKA_MODULUS_BITS, value: 2048 }, { type: pkcs11.CKA_MODULUS, value: Buffer.from("替换为实际模数二进制内容") }, { type: pkcs11.CKA_PUBLIC_EXPONENT, value: Buffer.from([0x01, 0x00, 0x01]) }, { type: pkcs11.CKA_SUBJECT, value: Buffer.from("替换为实际DER编码的主题内容") }, { type: pkcs11.CKA_ID, value: Buffer.from("1") }, { type: pkcs11.CKA_LABEL, value: "测试公钥" } ]; // 调用创建对象接口,返回公钥句柄 const publicKeyHandle = pkcs11Instance.C_CreateObject(session, publicKeyAttrs);
注意事项
部分USB Token厂商的PKCS11实现会有自定义校验规则,比如要求公钥的CKA_ID必须和对应私钥的ID一致、CKA_SUBJECT必须符合X.509规范,这些规则和你在Java侧调用时的要求完全一致,不需要额外调整。
内容的提问来源于stack exchange,提问作者Farzanenia
相关产品推荐
相关产品推荐

