我正在使用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必须是一个特定的名称,但我没有在任何地方找到该列表。 'dynamic'
正在为我工作。
任何帮助将不胜感激!
答案 0 :(得分:2)
发现!!!!
是的,完全是我来自的方式。
因此,实际上在M2Crypto.Engine中没有实现ENGINE_init()。所以,只有一个解决方案:修补! (非常小......)所以我创建了一个新的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()”,它就可以工作.....
答案 1 :(得分:1)
我不知道当前M2Crypto中存在的engine_init代码是什么以及为什么应该这样做。使用以下补丁将ENGINE_init()作为engine_init2暴露给M2Crypto有助于:
Index: SWIG/_engine.i
===================================================================
--- SWIG/_engine.i (revision 719)
+++ SWIG/_engine.i (working copy)
@@ -44,6 +44,9 @@
%rename(engine_free) ENGINE_free;
extern int ENGINE_free(ENGINE *);
+%rename(engine_init2) ENGINE_init;
+extern int ENGINE_init(ENGINE *);
+
/*
* Engine id/name functions
*/
在此之后,下面的代码会让我更进一步(但urllib目前并不能完全适用于我):
import sys, os, time, cgi, urllib, urlparse
from M2Crypto import m2urllib2 as urllib2
from M2Crypto import m2, SSL, Engine
# load dynamic engine
e = Engine.load_dynamic_engine("pkcs11", "/Users/martin/prefix/lib/engines/engine_pkcs11.so")
pk = Engine.Engine("pkcs11")
pk.ctrl_cmd_string("MODULE_PATH", "/Library/OpenSC/lib/opensc-pkcs11.so")
m2.engine_init2(m2.engine_by_id("pkcs11")) # This makes the trick
cert = e.load_certificate("slot_01-id_01")
key = e.load_private_key("slot_01-id_01", sys.argv[1])
ctx = SSL.Context("sslv23")
ctx.set_cipher_list("HIGH:!aNULL:!eNULL:@STRENGTH")
ctx.set_session_id_ctx("foobar")
m2.ssl_ctx_use_x509(ctx.ctx, cert.x509)
m2.ssl_ctx_use_pkey_privkey(ctx.ctx, key.pkey)
opener = urllib2.build_opener(ctx)
urllib2.install_opener(opener)
答案 2 :(得分:0)
查看所提供的pastebin link Becky,我相信它会在新API中转换为类似内容:
from M2Crypto import Engine, m2
dynamic = Engine.load_dynamic_engine("pkcs11", "/Users/martin/prefix/lib/engines/engine_pkcs11.so")
pkcs11 = Engine.Engine("pkcs11")
pkcs11.ctrl_cmd_string("MODULE_PATH", "/Library/OpenSC/lib/opensc-pkcs11.so")
r = pkcs11.ctrl_cmd_string("PIN", sys.argv[1])
key = pkcs11.load_private_key("id_01")
所以我打赌如果用“/usr/local/ssl/lib/engines/engine_pkcs11.so”和“/ Library / OpenSC”替换“/Users/martin/prefix/lib/engines/engine_pkcs11.so” /lib/opensc-pkcs11.so“with”/usr/lib/libeTPkcs11.so“你可能会让它与阿拉丁合作。
答案 3 :(得分:0)
这正是我尝试过的代码。但它结束时出现以下错误:
Traceback (most recent call last):
File "prog9.py", line 13, in <module>
key = pkcs11.load_private_key("id_45")
File "/usr/lib/pymodules/python2.5/M2Crypto/Engine.py", line 70, in load_private_key
return self._engine_load_key(m2.engine_load_private_key, name, pin)
File "/usr/lib/pymodules/python2.5/M2Crypto/Engine.py", line 60, in _engine_load_key
raise EngineError(Err.get_error())
M2Crypto.Engine.EngineError: 11814:error:26096075:engine outines:ENGINE_load_private_key:not initialised:eng_pkey.c:112:
我正在使用OpenSC PKCS11 lib,而不是aladdin lib。但我不认为问题已经结束。
答案 4 :(得分:0)
我尝试了Heikki建议的代码(减去一行)并得到与Erlo相同的错误。对于load_private_key(),我如何知道该参数的内容?
dynamic = Engine.load_dynamic_engine("pkcs11", "/usr/local/ssl/lib/engines/engine_pkcs11.so")
# m2.engine_free(dynamic) this line gave me an error TypeError: in method 'engine_free', argument 1 of type 'ENGINE *'
pkcs11 = Engine.Engine("pkcs11")
pkcs11.ctrl_cmd_string("MODULE_PATH", "/usr/lib/libeTPkcs11.so")
r = pkcs11.ctrl_cmd_string("PIN", "password")
key = pkcs11.load_private_key("id_01")
答案 5 :(得分:0)
我认为问题实际上不是“load_private_key()”。这就像“MODULE_PATH”定义和load_private_key()调用之间缺少某些东西。如果你用错误的路径重新编写“/usr/lib/libeTPkcs11.so”会怎样?在我的情况下,我没有与此相关的错误。
我在高级调试级别的前台运行“pcscd”,在python执行期间没有调用智能卡......所以肯定,我不明白什么是错的......
“openssl”中的等价物使用“-pre”命令。 “-pre”(与“-post”相反)是在加载之前发送到引擎的命令。也许我们需要在所有“ctrl_cmd_string”调用之后调用一个“加载”引擎的方法? ...
迷失: - /