编程语言
首页 > 编程语言> > python – 需要使用M2Crypto.Engine访问USB令牌的帮助

python – 需要使用M2Crypto.Engine访问USB令牌的帮助

作者:互联网

我使用的是M2Crypto-0.20.2.我想使用OpenSC项目中的engine_pkcs11和Aladdin PKI客户端进行基于令牌的身份验证,通过ssl进行xmlrpc调用.

from M2Crypto import Engine

Engine.load_dynamic()
dynamic = Engine.Engine('dynamic')
# Load the engine_pkcs from the OpenSC project
dynamic.ctrl_cmd_string("SO_PATH", "/usr/local/ssl/lib/engines/engine_pkcs11.so")
Engine.cleanup()

Engine.load_dynamic()
# Load the Aladdin PKI Client
aladdin = Engine.Engine('dynamic')
aladdin.ctrl_cmd_string("SO_PATH", "/usr/lib/libeTPkcs11.so")

key = aladdin.load_private_key("PIN","password")

这是我收到的错误:

key = pkcs.load_private_key("PIN","eT0ken")
File "/usr/local/lib/python2.4/site-packages/M2Crypto/Engine.py", line 70, in load_private_key
    return self._engine_load_key(m2.engine_load_private_key, name, pin)
File "/usr/local/lib/python2.4/site-packages/M2Crypto/Engine.py", line 60, in _engine_load_key
    raise EngineError(Err.get_error())
M2Crypto.Engine.EngineError: 23730:error:26096075:engine routines:ENGINE_load_private_key:not initialised:eng_pkey.c:112:

对于load_private_key(),应该作为第一个参数传递什么? M2Crypto文档没有解释它.

加载引擎时没有任何错误,但我不确定我是否正确加载它们.看起来引擎ID必须是一个特定的名称,但我没有在任何地方找到该列表. ‘动态’对我有用.

任何帮助,将不胜感激!

解决方法:

找到!!!!

是的,正是我来自的方式.

因此,实际上ENGINE_init()未在M2Crypto.Engine中实现.所以,只有一个解决方案:修补! (非常小……)所以我创建了一个新的Engine方法(在Engine.py中)

def engine_initz(self):
        """Return engine name"""
        return m2.engine_initz(self._ptr)

为什么engine_initz?因为engine_init已在SWIG / _engine.i中定义,:

void engine_init(PyObject *engine_err) {
    Py_INCREF(engine_err);
    _engine_err = engine_err;
}

我真的不知道做了什么,所以我更喜欢创建一个新的…所以我刚刚将以下内容添加到SWIG / _engine.i:

%rename(engine_initz) ENGINE_init;
extern int ENGINE_init(ENGINE *);

并重新编译__m2crypto.so,现在只需在启动私钥之前添加“pkcs11.engine_initz()”,它就可以工作…..

标签:m2crypto,python
来源: https://codeday.me/bug/20191007/1864105.html