You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python结合ePass3003令牌实现数字签名?代码报错及标签疑问

解决ePass3003令牌PyKCS11签名报错及私钥标签查找问题

一、修复AttributeError报错

你的错误源于PyKCS11常量引用方式错误:PyKCS11中CKA、CKO相关常量是以独立变量形式存在的(如CKA_CLASS、CKO_PRIVATE_KEY),而非CKA或CKO字典的属性。代码里CKA.CLASS、CKO.PRIVATE_KEY的写法会触发dict无CLASS属性的报错。

修正要点:

  • 将(CKA.CLASS, CKO.PRIVATE_KEY)替换为(CKA_CLASS, CKO_PRIVATE_KEY)
  • 将(CKA.LABEL, 'PrivateKeyLabel')替换为(CKA_LABEL, '实际私钥标签')(标签值需通过后续步骤获取)

二、查找私钥标签

由于ePass3003无法导出私钥,你可以通过遍历令牌中的私钥对象,打印其标签属性来获取真实值:

在登录后添加以下代码:

# 查找所有私钥对象
private_keys = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])
for idx, key in enumerate(private_keys):
    # 获取私钥的标签属性
    label = session.getAttributeValue(key, [CKA_LABEL])[0]
    print(f"私钥{idx+1}标签: {label.decode('utf-8') if isinstance(label, bytes) else label}")

运行这段代码会列出令牌中所有私钥的标签,将找到的标签替换到签名代码的CKA_LABEL对应值即可。

三、完整修正后的签名代码

以下是修复错误并支持JSON数据签名的完整代码:

from PyKCS11 import *
import json

# 初始化PKCS#11库
lib = 'E:/lib_x64/ShuttleCsp11_3003.dll'  

pkcs11 = PyKCS11Lib()
pkcs11.load(lib)

# 打开会话
slot = pkcs11.getSlotList()[0]  
session = pkcs11.openSession(slot)

try:
    # 登录PIN
    session.login('1234')

    # 首次运行时打开注释,获取私钥标签后替换target_label
    # private_keys = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY)])
    # for idx, key in enumerate(private_keys):
    #     label = session.getAttributeValue(key, [CKA_LABEL])[0]
    #     print(f"私钥{idx+1}标签: {label.decode('utf-8') if isinstance(label, bytes) else label}")

    # 替换为实际找到的私钥标签
    target_label = "你的私钥标签"
    private_key = session.findObjects([(CKA_CLASS, CKO_PRIVATE_KEY), (CKA_LABEL, target_label)])[0]

    # 待签名的JSON数据
    json_data = {"name": "test", "value": 123}
    # 将JSON转为字节流(签名需处理二进制数据)
    data_to_sign = json.dumps(json_data, ensure_ascii=False).encode('utf-8')

    # 使用RSA_PKCS机制签名
    signature = session.sign(private_key, data_to_sign, Mechanism(CKM_RSA_PKCS))

    print("签名结果(十六进制):", bytes(signature).hex())

except PyKCS11Error as e:
    print(f"PyKCS11错误: {e}")
finally:
    session.logout()
    session.closeSession()

注意事项

  • 首次运行时打开查找私钥标签的代码注释,获取真实标签后再替换target_label。
  • JSON数据签名时需先序列化为字节流,确保签名数据的一致性。
  • 确保使用的PKCS#11库(ShuttleCsp11_3003.dll)与系统位数(x64)匹配。

内容的提问来源于stack exchange,提问作者aisha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:12:51