首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python线程中的pkcs11

python线程中的pkcs11
EN

Stack Overflow用户
提问于 2016-08-02 04:23:18
回答 1查看 511关注 0票数 2

如下所示,在单个python线程中,我收到错误消息“请在任何插槽中插入令牌”,并且它似乎看不到我的令牌。我将代码更改为不从多处理线程内部运行,它就可以工作了。为了将PyKCS11库从我也通过使用ctype和包装在opensc中实现的标准pkcs11函数进行测试的等式中去掉,我仍然遇到了相同的问题,除了从python Thread运行之外,它在哪里都可以工作。什么会导致这种情况?

从python线程内部使用pkcs11失败:

代码语言:javascript
复制
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是可行的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2016-08-02 19:07:47

关于多线程和PKCS#11库的更多信息可以在PKCS#11 v2.20规范的6.6.2章中找到:

6.6.2应用程序和线程

一些应用程序将以多线程方式访问Cryptoki库。Cryptoki使应用程序能够向库提供信息,以便它们可以为多线程提供适当的支持。特别是,当应用程序通过调用C_Initialize初始化Cryptoki库时,它可以为库指定四种可能的多线程行为之一:

  1. 应用程序可以指定它将不从多个线程并发访问库,并且因此该库不必担心执行任何类型的锁定为了thread-safety.
  2. The应用程序可以指定它将从多个线程并发访问库,并且该库必须能够使用本机操作系统同步原语以确保适当的线程安全行为。
  3. 该应用程序可以指定它将从多个线程并发访问库,库必须使用应用程序提供的一组同步基元来确保正确的线程安全行为。
  4. 应用程序可以指定它将从多个线程并发访问库,并且库必须使用本机操作系统同步基元或应用程序提供的一组同步基元来确保正确的线程安全行为。

IMO多线程应用程序中最常用的类型是第二种类型。要激活它,您需要向C_Initialize函数传递CKF_OS_LOCKING_OK标志。下面的代码展示了如何使用Pkcs11Interop库在C#中实现这一点:

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38707469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档