如下所示,在单个python线程中,我收到错误消息“请在任何插槽中插入令牌”,并且它似乎看不到我的令牌。我将代码更改为不从多处理线程内部运行,它就可以工作了。为了将PyKCS11库从我也通过使用ctype和包装在opensc中实现的标准pkcs11函数进行测试的等式中去掉,我仍然遇到了相同的问题,除了从python Thread运行之外,它在哪里都可以工作。什么会导致这种情况?
从python线程内部使用pkcs11失败:
from PyKCS11 import LowLevel
import sys
from multiprocessing import Thread
class MyThread(Thread):
def run(self):
lib = "/usr/local/lib/opensc-pkcs11.so" # place here your PKCS#11 library
pin = "12345678" # place here the pin of your token
a = LowLevel.CPKCS11Lib()
info = LowLevel.CK_INFO()
slotList = LowLevel.ckintlist()
loadRes = a.Load(lib, 1)
print "Load of library '%s' : %s " % (lib, str(loadRes) )
if not loadRes:
sys.exit(1)
print "C_GetInfo: rv=" , hex(a.C_GetInfo(info))
print "Library manufacturerID: ", info.GetManufacturerID()
# listing only slots with a token inside.
rv = a.C_GetSlotList(1, slotList)
if (rv != LowLevel.CKR_OK):
sys.exit(1)
if len(slotList) == 0:
print "Please insert a token in any slot"
sys.exit(1)
mythread = MyThread()
mythread.start()
mythread.join()在线程外部使用pkcs11是可行的:
from PyKCS11 import LowLevel
import sys
def run(self):
lib = "/usr/local/lib/opensc-pkcs11.so" # place here your PKCS#11 library
pin = "12345678" # place here the pin of your token
a = LowLevel.CPKCS11Lib()
info = LowLevel.CK_INFO()
slotList = LowLevel.ckintlist()
loadRes = a.Load(lib, 1)
print "Load of library '%s' : %s " % (lib, str(loadRes) )
if not loadRes:
sys.exit(1)
print "C_GetInfo: rv=" , hex(a.C_GetInfo(info))
print "Library manufacturerID: ", info.GetManufacturerID()
# listing only slots with a token inside.
rv = a.C_GetSlotList(1, slotList)
if (rv != LowLevel.CKR_OK):
sys.exit(1)
if len(slotList) == 0:
print "Please insert a token in any slot"
sys.exit(1)
run()测试环境:
操作系统: OSX Yosemite
pkcs11中间件: opensc
发布于 2016-08-02 19:07:47
关于多线程和PKCS#11库的更多信息可以在PKCS#11 v2.20规范的6.6.2章中找到:
6.6.2应用程序和线程
一些应用程序将以多线程方式访问Cryptoki库。Cryptoki使应用程序能够向库提供信息,以便它们可以为多线程提供适当的支持。特别是,当应用程序通过调用C_Initialize初始化Cryptoki库时,它可以为库指定四种可能的多线程行为之一:
IMO多线程应用程序中最常用的类型是第二种类型。要激活它,您需要向C_Initialize函数传递CKF_OS_LOCKING_OK标志。下面的代码展示了如何使用Pkcs11Interop库在C#中实现这一点:
Pkcs11 pkcs11 = new Pkcs11(libraryPath);
CK_C_INITIALIZE_ARGS initArgs = new CK_C_INITIALIZE_ARGS();
initArgs.Flags = CKF.CKF_OS_LOCKING_OK;
CKR rv = pkcs11.C_Initialize(initArgs);
if ((rv != CKR.CKR_OK) && (rv != CKR.CKR_CRYPTOKI_ALREADY_INITIALIZED))
throw new Pkcs11Exception("C_Initialize", rv);我认为您需要在Python中使用类似的代码。这里只是猜测,但也许您需要将一些参数传递给LowLevel.CPKCS11Lib()?
https://stackoverflow.com/questions/38707469
复制相似问题